【JS】简述seacrch、match、exec、test

来源:互联网 发布:花生壳远程监控软件 编辑:程序博客网 时间:2024/06/04 17:54

背景

前段时间做一个输入验证时,需要判断字符串中是否存在汉字,趁机复习下正则表达式吧。

汉字的判断不同于字母数字和符号,在正则规则中,他们都有自身的字符集,汉字则没有。所以我们使用汉字的Unicode编码进行判断,汉字的编码范围是\u4E00-\u9FA5,但是要注意的是这个编码范围是ES5中的范围,在ES6中对汉字(繁体字)的编码进行了优化,对ES6中Unicode编码感兴趣的可以自己去查阅下。

进入正题,本文就以验证汉字为题,简单复习下JS中search、match、exec、test这四个API。


正则表达式

let str = ‘[abc,第一处,abc,第二处]’;

let reg = /([\u4E00-\u9FA5]+)/;
let reg_g = /([\u4E00-\u9FA5]+)/g;

首先创建我们测试使用的包含汉字的字符串,以及带有参数g和不带有参数g的正则表达式。接下来看下他们的区别。

说明:返回与正则表达式查找内容匹配的第一个子字符串的位置(偏移位)。

let rs_search = str.search(reg);
let rs_search_g = str.search(reg_g);
console.log(rs_search,rs_search_g); //5 5

从输出结果来看,带有g和不带有g的结果是一致的。
这个方法有点类似与indexOf,都是返回字符出现的第一个位置。查找失败则返回-1。

match

说明:使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。

let rs_match = str.match(reg); //[ ‘第一处’, ‘第一处’, index: 5, input: ‘[abc,第一处,abc,第二处]’ ]
let rs_match_g = str.match(reg_g); //[ ‘第一处’, ‘第二处’ ]

不带参数g:它的返回值是匹配到的第一个子串的详细信息,包含value,index,input。

参数g:它的返回值是匹配到的所有子串的value,不包含子串的详细信息。

exec

说明:用正则表达式模式在字符串中查找,并返回该查找结果的第一个值(数组),如果匹配失败,返回null。

let rs_exec = reg.exec(str); //[ ‘第一处’, ‘第一处’, index: 5, input: ‘[abc,第一处,abc,第二处]’ ]
let rs_exec_g = reg_g.exec(str); //[ ‘第一处’, ‘第一处’, index: 5, input: ‘[abc,第一处,abc,第二处]’ ]

在这里可以看到有参数g时,返回值时一样的。但是它们还是有区别的,带有参数g时,可以使用for循环,继续匹配下一个子串。

let rs_exec_g = [];
while((rs_exec_g = reg_g.exec(str)) != null){ //使用g,不然会无限循环
/**
*两次输出,匹配不到自动结束匹配
*
*index: 5 , value: 第一处,第一处
*index: 13 , value: 第二处,第二处
*/
console.log(index: ${rs_exec_g.index} , value: ${rs_exec_g})
}

注意:使用while时,必须带有参数g,不然会变成一个无线循环,以为返回值一直不为空。

test

说明:返回一个 Boolean 值,它指出在被查找的字符串中是否匹配给出的正则表达式。

let rs_test = reg.test(str); //true
let rs_test_g = reg_g.test(str); //true

类似与exec,只是执行单行语句时,有无参数g,返回值一致。但是,带有参数g时,可以使用参数g,继续匹配下一个子串。

let rs_test_g;
while((rs_test_g = reg_g.test(str)) == true){ //使用g,不然会无限循环
console.log(rs_test_g)
}

注意: 与exec一样,必须带参数g。


总结

  • search与match的写法一致,都是String的API
  • exec与test的写法一致,都是RegExp的API
  • exec与test的参数正则表达式带有参数g时,可以使用循环遍历原因与lastIndex有关,lastIndex不会被重置为0

额外加一句,MarkDown文本编辑器,使用起来挺顺手的,符合程序员的编码习惯>_<

阅读全文
0 0
原创粉丝点击