正则表达式中常用的方法

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

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修饰符
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容