RegExp相关的几个方法-test、exec、match、matchAll、replace、replaceAll、search

2023-12-08

javscript中跟RegExp相关的几个方法有:test、exec、match、matchAll、replace、replaceAll、search。其中test、exec属于RegExp实例的方法,其余几个都是String实例上的方法

test
// 匹配返回true,不匹配false
/e/.test(“The best things in life are free!”)

match/matchAll
不加g
假设有个字符串:

const str = ‘abc${a}dfdsd${b}ddd’
我们要获取 {} 里面的值

正则中用小括号包裹起来的为捕获组

‘abc${a}dfdsd${b}ddd’.match(/\{(.+?)\}/)

可以看到,这里数组第 0 项为匹配到的值,第 1 项为捕获组。因为正则没加 g,所以只匹配到了第一项。

加g

加 g 之后,确实可以匹配到所有的了,但是不会展示捕获组和其他 group、index 等信息。

group 的使用
在要捕获的里面定义一个变量 ?<var>,返回结果的 groups 字段就会有


matchAll
不加g


加g

返回的是一个迭代器,我们解构一下

可以看到,match 加 g 后无法获取所有的捕获值,而 matchAll 可以

match、matchAll对比:
1.对于match来说,如果正则表达式中有g修饰,结果返回所有与正则表达式匹配的字符串的列表。捕获项会被忽略!
2.对于match来说,如果正则表达式中没有g修饰,结果除了返回第一个匹配外,还会列出其所有捕获项!
3.对于matchAll来说,如果正则表达式有g修饰,其返回的迭代项是一个个的数组,数组中除了包含匹配的完整字符串和所有捕获项外,还包含有index、input、groups这三个属性,index表示当前匹配项在原字符串中的索引位置,input表示输入的原始字符串,groups是一个包含所以分组的对象。
4.对于matchAll来说,如果正则表达式没有g修饰,会报错!

exec
和 match 的返回结果一致

不加g
/\{(.+?)\}/.exec(‘abc${a}dfdsd${b}ddd’)
加g

可以看到和不加g一样,你会说那这个 API 如何进行全局检索?

全局模式下,exec可以多次执行,每次执行返回的结果同match函数。并且会在正则对象下记录 lastIndex 位置,当匹配不上时返回 null 并且 lastIndex 记录为 0。
所以根据这一点我们可以通过遍历来获取我们想要的结果:

// 返回的数组
let m = null;
while((m = reg.exec(str)) != null){
// 每次匹配返回的结果
console.log(m);
// 每次匹配返回的lastIndex
console.log(reg.lastIndex);
}
// 最终为0
console.log(reg.lastIndex);


search

如果匹配成功,则返回正则表达式在字符串中首次匹配项的索引;否则,返回-1。
不区分全局模式。

发表评论

邮箱地址不会被公开。 必填项已用*标注