正则表达式中常用的方法

以下讨论建立在正则中没有分组和子项的情况,在正则中有分组和子项时会有些许不同,具体请移步正则表达式中的分组与子项

test()方法

语法

正则.test(字符串);

作用

常用于判断用户输入数据的合法性,比如检验Email的合法性

参数

字符串

返回值

如果有匹配内容,则返回true
如果无匹配内容,则返回false

var str = 'Sumi122Sumi';
var re1 = /su/;    //字符串内是否可以匹配到'su'
var re2 = /ui/;    //字符串内是否可以匹配到'ul'
var re3 = /\d/;    //字符串内是否可以匹配到数字
console.log(re1.test(str));    //false    由于正则区分大小写,这里没有‘su’,故返回false
console.log(re2.test(str));    //false
console.log(re3.test(str));    //true
//判断是否有数字的简单例子
var str = 'Sumi122Sumi';
var re1 = /\d/;
if(re1.test(str)){
    console.log('有数字');
}else{
    console.log('没有数字');
}

search()方法

语法

字符串.search(正则或字符串);

作用

找到匹配的字符串(区分大小写)出现的第一个位置

参数

正则
字符串

返回值

如果找到了,则返回该位置对应的下标值
如果没找到,则返回-1

var str = 'Sumi122Sumi';
var re1 = /Su/;    //找Su第一次出现的位置
var re2 = /ui/;    //找ui第一次出现的位置
var re3 = /\d/;    //找数字第一次出现的位置
//参数为正则
console.log(str.search(re1));       //0
console.log(str.search(re2));       //-1
console.log(str.search(re3));       //4
//参数为字符串
console.log(str.search('su'));       //-1    search()方法本身就区分大小写,所以这里用su是搜索不到的
console.log(str.search('Su'));       //0
console.log(str.search('ui'));       //1
search()方法和indexOf()方法的区别
  1. search()方法区分大小写
    indexOf()方法不区分大小写
  2. search()方法的参数可以为字符串和正则
    indexOf()方法的参数只能为字符串

match()方法

语法

字符串.match(正则或字符串);

作用

找到匹配的字符串(区分大小写),并将它存入数组中,然后返回数组

参数

正则
字符串

返回值

数组

  • 如果不带g修饰符,只会匹配一个结果,并且给找到的数组添加indexinput属性
    index:匹配结果对应的下标值
    input:原字符串
  • 如果带g修饰符,则为全局匹配,结果里放找到的匹配的所有字符
  • 如果没有找到,返回null
var str = 'sumi12su122mi1222su123mi';
var re1 = /u/;
var re2 = /\d/;
var re3 = /i/g;
var re4 = /\d/g;
var re5 = /\d\d/g;
var re6 = /\d+/g;
var re7 = /a/;

//由于这里不带g修饰符,所以只会匹配一个结果,然后添加index和input属性
console.log(str.match(re1));    //["u", index: 1, input: "sumi12su122mi122su123mi"]
console.log(str.match(re2));    //["1", index: 4, input: "sumi12su122mi122su123mi"]

//由于这里有g修饰符,所以会匹配到所有的结果,不会添加index和input属性
console.log(str.match(re3));    //["i", "i", "i"]
console.log(str.match(re4));    //["1", "2", "1", "2", "2", "2", "1", "2", "2", "1", "2", "3"]

//这里连续输入两个\d就代表寻找到所有两个连在一起的数字
console.log(str.match(re5));    //["12", "12", "22", "12", "12"]

//这里用到了量词,表示数字至少出现一次,找到的字符数量就不是确定的了,即连在一起的数字都会一起被找到并存入数组
console.log(str.match(re6));    //["12", "1222", "122", "123"]

//没有找到,返回null
console.log(str.match(re7));    //null

replace()方法

语法

字符串.replace(字符串或正则,字符串或函数);

作用

替换匹配到的第一个字符串(区分大小写)(原字符串不变)

参数

  • 第一个参数:需要匹配的字符串
  • 第二个参数:用于替换匹配到的字符串的内容

如果第二个参数为函数
1.一定要有返回值,否则会用undefined取代替换后内容
2.函数有三个参数:

  • 第一个参数:需要匹配的字符串
  • 第二个参数:匹配到的字符串对应的下标值
  • 第三个参数:原字符串

返回值

替换后的字符串

var str = 'sumisumi';

//第一个参数可以为字符串或者正则,且只替换匹配到的第一个字符串,原字符串不变
var newStr1 = str.replace('s','l');
console.log(newStr1,str);    //lumisumi sumisumi
var newStr2 = str.replace(/s/,'l');
console.log(newStr2,str);    //lumisumi sumisumi

//如果有g修饰符,那么匹配到的所有都可以被替换
var newStr3 = str.replace(/s/g,'1');
console.log(newStr3);    //1umi1umi

//如果replace方法第二个参数为函数,那么一定要有返回值,否则用undefined取代替换后内容
var newStr4 = str.replace(/s/,function(){
    return 'l';
});
console.log(newStr4);    //lumisumi
var newStr4 = str.replace(/s/,function(){});
console.log(newStr4);    //undefinedumisumi

//函数的三个参数分别为:需要匹配的字符串、匹配到的字符串对应的下标值、原字符串
var newStr5 = str.replace(/s/,function(a,b,c){
    console.log(a,b,c);    //s 0 sumisumi
});
第二个参数为函数的应用:屏蔽某些不干净的词汇

首先声明一个变量,这里不干净的词汇用 “和谐” 代替~我们的目的是将 “和谐” 替换为*

var str = '你和谐的是不是和谐的傻';

然后要用到替换字符的方法

var newStr = str.replace(/和谐的/,function(a,b,c){});

这时候就要在函数三个参数身上做文章了,这里的需求就是每一个需要屏蔽的字都被替换为*

问题来了,如何获取到被屏蔽的字的数量呢?
答案很简单,a代表的是匹配到的字符串,那么在这里就是需要被屏蔽的字符串,可以利用a.length获取到需要被屏蔽的字符串内字符的数量

获取到数量后,如何将字符的数量和*的数量对等起来呢?
这里需要利用for循环,声明一个空的字符串变量,循环一次就给变量里面添加一个*,然后将这个变量返回,屏蔽的字符串就会变为这个变量的内容了

var newStr = str.replace(/和谐的/,function(a,b,c){
    var str = '';
    for(var i=0;i<a.length;i++){
        str += '*';
    }
    return str;
});

我们这里来输出一下结果

console.log(newStr);    //你**的是不是和谐的傻

可以看到这里只屏蔽了第一个需要屏蔽的词语,那么我们只需要在正则里加上修饰符g就可以完善这个功能了

var newStr = str.replace(/和谐的/g,function(a,b,c){...};

完整代码如下:

var str = '你和谐的是不是和谐的傻';
var newStr = str.replace(/和谐的/g,function(a,b,c){
    var str = '';
    for(var i=0;i<a.length;i++){
        str+='*';
    };
    return str;
});
console.log(newStr);    //你***是不是***傻

总结

test()方法
  • 常用于测试输入数据的内容是否与数据的规则匹配,例如手机号为11位数、邮箱格式为xxx@xxx.xxx等等,也正如它的名字,test测试
  • 它的语法与其他三种方法不太相同,正则.test(字符串),正则表达式在前
  • 它的参数只能为字符串
  • 它的返回值为布尔值,如果为true则表示有匹配的内容,如果为false则表示没有匹配的内容
search()方法
  • 用于寻找匹配到的字符串对应的下标值,与indexOf方法类似,但是它们之间还是有差别的
  • 它的语法为字符串.search(字符串或正则),参数可以为字符串或者正则
  • 它的返回值是一个数字,如果找到了匹配的内容,返回下标值,如果没有找到,返回-1
  • 这个方法本身就区分大小写,如果需要忽略大小写区分,则需要加上i修饰符
match()方法
  • 用于寻找匹配到的字符串,然后将其存入数组并返回,只返回匹配到的第一个结果
  • 它的语法为字符串.match(字符串或正则),参数可以为字符串或者正则
  • 它的返回值是数组或者null,当参数为正则时,如果没有修饰符g,则返回只含有一个匹配结果的数组,且会给数组加上indexinput属性;如果有修饰符g,则会返回含有所有匹配结果的数组,不会加上indexinput属性;如果没有匹配到,则返回null
  • 这个方法本身就区分大小写,如果需要忽略大小写区分,则需要加上i修饰符
replace()方法
  • 用于一个字符串去替换匹配到的字符串,只替换匹配到的第一个结果
  • 它的语法与上面的又不太相同,包含两个参数,str.replace(字符串或正则,字符串或函数)
  • 它的第一个参数为需要匹配的字符串,可以为正则或字符串;第二个参数为替换的匹配的字符串的字符串,可以为字符串或函数
  • 它的第一个参数为正则时,如果有修饰符g,则会替换匹配到的所有结果;如果没有修饰符g,则只会替换匹配到的第一个结果
  • 当它的第二个参数为函数时,必须要有返回值,否则函数会返回undefined,并用undefined去替换匹配到的字符串
  • 当它的第二个参数为函数时,函数有三个参数,第一个参数为匹配到的需要被替换的字符串,第二个参数为匹配到的字符串对应的下标值,第三个参数为原字符串
  • 它的返回值为替换后的字符串原字符串不变
  • 这个方法本身就区分大小写,如果需要忽略大小写区分,则需要加上i修饰符

推荐阅读更多精彩内容