JS字符串查找(6种方法)

在开发中经常需要检索字符串、查找特定字符串。用户可以选用下面的方法执行对应的操作,说明如表所示。

String 类型的查找字符串方法
字符串方法 说明
charAt() 返回字符串中的第 n 个字符
charCodeAt() 返回字符串中的第 n 个字符的代码
indexOf() 检索字符串
lastIndexOf() 从后向前检索一个字符串
match() 找到一个或多个正则表达式的匹配
search() 检索与正则表达式相匹配的子串

查找字符

使用字符串的 charAt() 和 chatCodeAt() 方法,可以根据参数(非负整数的下标值)返回指定位置的字符或字符编码。

对于 charAt() 方法来说,如果参数不在 0 和字符串的 length-1 之间,则返回空字符串;而对于 charCodeAt() 方法来说,则返回 NaN,而不是 0 或空字符串。

示例1

下面示例为 String 类型扩展一个原型方法,用来把字符串转换为数组。在函数中使用 charAt() 方法读取字符串中每个字符,然后装入一个数组并返回。
String.prototype.toArray = function () {  //把字符串转换为数组
    var 1 = this.length; a = [];  //获取当前字符串长度,并定义空数组
    if (1) {  //如果存在则执行循环操作,预防空字符串
        for (var i = 0; i < 1; i ++) {  //遍历字符串,枚举每个字符
            a.push(this.charAt(i));  //把每个字符按顺序装入数组
        }
    }
    return a;  //返回数组
}
应用原型方法:
var s = "abcdefghijklmn".toArray();  //把字符串转换为数组
for (var i in s) {  //遍历返回数组,显示每个字符
    console.log(s[i]);
}

查找字符串

使用字符串的 indexOf() 和 lastIndexOf() 方法,可以根据参数字符串,返回指定子字符串的下标位置。这两个方法都有两个参数,说明如下。
  • 第一个参数为一个子字符串,指定要查找的目标。
  • 第二个参数为一个整数,指定查找的起始位置,取值范围是 0~length-1。
对于第二个参数来说,需要注意一下几个特殊情况。
  • 如果值为负数,则视为 0,相当于从第一个字符开始查找。
  • 如果省略了这个参数,也将从字符串的第一个字符开始查找。
  • 如果值大于等于 length 属性值,则视为当前字符串中没有指定的子字符串,返回 -1。

示例2

下面代码查询字符串中首个字母 a 的下标位置。
var s = "JavaScript";
var i = s.indexOf("a");
console.log(i);  //返回值为1,即字符串中第二个字符
indexOf() 方法只返回查找到的第一个子字符串的起始下标值,如果没有找到则返回 -1。

示例3

下面代码查询 URL 字符串中首个字母 n 的下标位置。
var s = "www.xinbaoku.com";
var a = s.indexOf("biancheng");  //返回值为3,即第一个字符n的下标位置
如果要查找下一个子字符串,则可以使用第二个参数来限定范围。

示例4

下面代码分别查询 URL 字符串中两个点号字符下标的位置。
var s = "www.xinbaoku.com";
var b = s.indexOf(".");  //返回值为1,即第一个字符.的下标位置
var e = s.indexOf(".", b + 1);  //返回值为11,即第二个字符.的下标位置
indexOf() 方法是按照从左到右的顺序进行查找的。如果希望从右到左来进行查找,则可以使用 lastIndexOf() 方法来查找。 

示例5

下面代码按从右到左的顺序查询 URL 字符串中最后一个点号字符的下标位置。
var s = "www.xinbaoku.com";
var n = s.lastIndexOf(".");  //返回值为11,即第二个字符.的下标位置
lastIndexOf() 方法的查找顺序是从右到左但是其参数和返回值都是根据字符串的下标按照从左到右的顺序来计算的,即字符串第一个字符下标值始终都是 0,而最后一个字符的下标值始终都是 length-1。

示例6

lastIndexOf() 方法的第二个参数指定开始查找的下标位置,但是,将从该点开始向左查找,而不是向右查找。
var s = "https://www.xinbaoku.com";
var n = s.lastIndexOf(".", 11);  //返回值是8,而不是18
其中第二个参数值 11 表示字符 a (第一个)的下标位置,然后从左侧开始向左查找,所以就返回第一个点号的位置。如果找到,则返回第一次找到的字符串的起始下标值。
var s = "https://www.xinbaoku.com";
var n = s.lastIndexOf("c");  //返回值为7
如果没有设置第二个参数,或者为参数负值,或者参数大于等于 length,则将遵循 indexOf() 方法进行操作。

搜索字符串

search() 方法和 indexOf() 的功能是相同的,查找指定字符串第一次出现的位置。但是 search() 方法仅有一个参数,定义匹配模式。该方法没有 lastIndexOf() 的反向检索功能,也不支持全局模式。

示例7

下面代码使用 search() 方法匹配斜杠字符在 URL 字符串的下标位置。
var s = "www.xinbaoku.com";
n="s.search("//");"
search() 方法参数定义:
  • search() 方法的参数为正则表达式(RegExp 对象)。如果参数不是 RegExp 对象,则 JavaScript 会使用 RegExp() 函数把它转换为 RegExp 对象。
  • search() 方法遵循从左到右的查找顺序,并返回第一个匹配的子字符串的起始下标位置值。如果没有找到,则返回 -1。
  • search() 方法无法查找指定的范围,始终返回的第一个匹配子字符串的下标值,没有 indexOf() 方法灵活。

匹配字符串

match() 方法能够找出所有匹配的子字符串,并以数组的形式返回。

示例8

下面代码使用 match() 方法找到字符串中所有字母 c,并返回它们。
var s = "https://www.xinbaoku.com";
var a = s.match(/c/n);  //全局匹配所有字符c
console.log(a);  //返回数组[c,c]。
match() 方法返回的是一个数组,如果不是全局匹配,那么 match() 方法只能执行一次匹配。例如,下面匹配模式没有 n 的修饰符,只能够执行一次匹配,返回仅有一个元素 c 的数组。
var a = s.match(/c/);  //返回数组[h]
如果没有找到匹配字符,则返回 null,而不是空数组。

当不执行全局匹配时,如果匹配模式包含子表达式,则返回子表达式匹配的信息。

示例9

下面代码使用 match() 方法匹配 URL 字符串中所有点号字符。
var s = "https://www.xinbaoku.com";
var a = s.match(/(\.).*(\.).*(\.)/ );  //执行一次匹配检索
console.log(a.length);
console.log(a[0]);
console.log(a[1]);
console.log(a[2]);
console.log(a[3]);
在这个正则表达式 “/(\.).*(\.).*(\.)/”中,左右两个斜杠是匹配模式分隔符,JavaScript 解释器能够根据这两个分隔符来识别正则表达式。在正则表达式中小括号表示子表达式,每个子表达式匹配的文本信息会被独立存储。点号需要转义,因为在正则表达式中它表示匹配任意字符,星号表示前面的匹配字符可以匹配任意多次。

在上面示例中,数组 a 包含 4 个元素,其中第一个元素存放的是匹配文本,其余元素存放的是每个正则表达式的子表达式匹配的文本。

另外,返回的数组还包含两个对象属性,其中 index 属性记录匹配文本的起始位置,input 属性记录的是被操作的字符串。
console.log(a.index);
console.log(a.input);
在全局匹配模式下,match() 将执行全局匹配。此时返回的数组元素存放的是字符串中所有匹配文本,该数组没有 index 属性和 input 属性;同时不再提供子表达式匹配的文本信息,也不提示每个匹配子串的位置。如果需要这些信息,可以使用 RegExp.exec() 方法。