字符串+正则相关函数汇总

有这样几个和字符串替换中经常使用到的函数:replacematchsearchexectest,老是混淆,这里列出来对比。

前三个是字符串的方法,后面两个方法属于正则式。


String相关的函数:

1. replace

调用方法:str.replace(regexp|substr, newSubStr|function)

注意点:如果第一个参数为字符串或者非全局g的正则,替换只会发生一次。

'aaaa'.replace('a','b')==='baaa';
'aaaa'.replace(/a/,'b')==='baaa';
'aaaa'.replace(/a/g,'b')==='bbbb';

使用字符串作为第二个参数的时候,替换字符串newSubStr可以插入下面的特殊变量名

变量名代表的值
$$插入字符串 "$".
$&插入第一个参数所匹配的子串
$`插入匹配子串左边的内容.
$'插入匹配子串右边的内容.
$n or $nn如果n或nn是个十进制的数字,并且replace方法的第一个参数是个正则表达式,那么$n表示正则表达式中的第n个子匹配字符串.

指定一个函数作为第二个参数时,函数传入的参数“数组”成员依次是:匹配到的字符串、各个分组、匹配到的index位置、整个被匹配的字符串;如果第一个参数是标记为g的正则,且如果能够匹配多次的话,第二个参数的function将被执行相应的次数。

'baaabottomaaaabaaa'.replace(/a((a)(a))/g,function(){
    console.log(arguments);
});
↓
["aaa", "aa", "a", "a", 1, "baaabottomaaaabaaa"]
["aaa", "aa", "a", "a", 10, "baaabottomaaaabaaa"]
["aaa", "aa", "a", "a", 15, "baaabottomaaaabaaa"]

2. match

调用方法:str.match(regexp)
参数为正则式,虽然非正则,比如字符串,也可以,不过其实执行了new RegExp(obj)的转换过程。
返回值:无匹配返回null,有匹配返回数组。

参数正则式是否为全局g将导致匹配结果的不同:

不含g的时候,和正则的exec方法结果相同,返回的数组有一个input属性,值为原始的用来匹配的字符串,以及一个index属性,是匹配到的串在原始字符串中的index;

含有全局g的时候,返回的数组包含所有的匹配项

3. search

调用方法:str.search(regexp)
只返回匹配到的第一个匹配在原始字符串中的位置,没匹配则返回-1,有时候我们只需要知道是否含有的情况,使用serch比上面的match速度更快;字符串的search方法对应的正则的test方法。


RegExp相关的函数:

1. exec

语法:regexObj.exec(str)
返回值:无匹配,返回null;如果有匹配,返回数组,数组的成员依次为匹配到的字符串、各个分组,同时这个数组具有一个input属性和index属性,上面已经介绍过。重点:当正则式对象global为true时候,正则式每执行一次exec,其lastIndex属性会发生改变,下一次regexObj执行exec的时候,是从lastIndex开始的,如果没有匹配,变为0;lastIndex也可以手动设置;global为false的时候,lastIndex一直是0;

2. test

语法:regexObj.test(str)
返回值:Boolean. true or false.
使用方法和字符串的search方法类似

标签: js, replace, match, search, exec, test

添加新评论