与正则表达式相关的API有以下7个:

  • RegExp.prototype​.test()
  • RegExp.prototype​.exec()
  • String​.prototype​.search()
  • String​.prototype​.match()
  • String​.prototype​.matchAll()
  • String​.prototype​.split()
  • String​.prototype​.replace()

在我们展开到各个方法之前,先来看一下在JavaScript里面定义一个正则表达式的两种方式:
1:字面量

let reg = /\d[a-z]/ig;

2:new一个RegExp()对象

let reg = new RegExp(/\d[a-z]/, 'ig');

上面的2种方式定义的正则表达式,对于我们接下来要讲的6个方法都是适用的。
一:RegExp.prototype​.test()
test()的参数是一个字符串,返回结果为布尔值。如果传入的字符串与正则表达式匹配,返回true,反之返回false。

let reg = new RegExp(/\d[a-z]/, 'ig');
reg.test('1a'); // true
reg.test('a1'); //false

二:RegExp.prototype​.exec()
exec()接受一个字符串为参数,如果有匹配的,返回一个数组,如果没有匹配则返回null。根据正则表达式里面是否有'g',exec()的行为有较大差异。接下来我们都讨论都是假设有匹配的情况:
1: 如果无'g',则返回一个数组,包含第一个匹配到的子串,更新index,但是不再继续匹配
2: 如果有'g',

1: 第一次执行exec(),则返回包含第一个匹配到的子串,更新index;
2: 等下一次再执行exec()时候,从index的位置开始继续匹配。
3: 如果没有可再匹配的,则返回null,把index设置为0

看到这里,可能有人会疑惑,为什么上面会提到下一次再执行exec()。因为,在有'g'的情况下,假如我给定的字符串有2处匹配,但是执行一次exec()其实只会得到一个匹配的子串,并不会一次性就把所有能匹配到的子串返回。所以,你得多次调用exec(),才能保证得到所有可匹配的子串。接下来我们就用代码来说明一下:

let str = 'can you open a can?';

let regexp = /can/ig;

let result = regexp.exec(str);
console.log(result);

我们得到结果:

["can", index: 0, input: "can you open a can?", groups: undefined]

意识里,我们可能以为会得到两个匹配(一个开头的'can'和句子结尾的'can'),但是事实是,哪怕是有'g'的情况下,你每调用一次exec()只会得到一个匹配结果。如果想到得到所有的匹配结果,我们就得循环调用exec():

let str = 'can you open a can?';

let regexp = /can/ig;

let result;
while (result = regexp.exec(str)) {
    console.log(result)
}

我们得到结果:

["can", index: 0, input: "can you open a can?", groups: undefined]
["can", index: 15, input: "can you open a can?", groups: undefined]

三:String​.prototype​.search()
search()参数为一个正则表达式,返回值为第一个匹配的index,如果没有任何匹配,则返回-1

let str = 'can you open a can?';
let regexp = /can/ig;
let regexp2 = /abc/ig;
console.log(str.search(regexp)); // 0
console.log(str.search(regexp2)); // -1

关于search()需要记住的是:它只返回第一个匹配的index,一旦找到就会停止搜索,不会再继续查找。

四:String​.prototype​.match()
match()方法也是会根据正则表达式是否带有'g'而表现得不同,我们可以先看一段代码对比一下:

let str = "Can you open a can";
let result = str.match( /can/i );
let result2 = str.match(/can/ig);
let result3 = str.match(/abc/ig);
console.log( result );//["Can", index: 0, input: "Can you open a can", groups: undefined]
console.log( result2 );// ["Can", "can"]
console.log( result3 );//null

我们从以上的result,result2,result3的结果可以得出match()的行为为

1: 当没有'g'时,会以数组的形式返回第一个匹配的子串,以及一些附加信息
2: 当有'g'时,会以数组的形式返回所有匹配的子串,但是没有附加信息
3: 如果没有匹配的子串,返回null

关于match()完整地行为,需要结合着匹配组的知识一起看:正则表达式捕获组
五:String.prototype.matchAll()
matchAll()还特别新,并不是所有的浏览器都支持了,这里先暂时不讨论。以后再来补充。
六:String​.prototype​.split()
split()方法的参数可以是一个正则表达式,也可以是一个字符;split()方法按照给定的正则表达式或者字符分割字符串,返回一个包含分割后的子串的数组。

let str = "Can-you-open-a-can";
console.log(str.split(/-/)); //["Can", "you", "open", "a", "can"]

七:String​.prototype​.replace()


nanaistaken
586 声望43 粉丝