正则匹配中通常有以下几种,包括String.match(), String.replace(), RegExp.exec()等。参考文档
1、字符串match方法
没有全局g标志
const regexp = /hello/
const str = 'hello abc , ceshihelloabc, abc hello'
const x = str.match(regexp)
console.log(x)
结果如下图:
如果 regexp 没有标志 g,那么 match() 方法就只能在 string 中执行一次匹配。如果没有找到任何匹配的文本,match() 将返回 null。否则,它将返回一个数组,其中存放了与它找到的匹配文本有关的信息。
该数组的第 0 个元素存放的是匹配文本,而其余的元素存放的是与正则表达式的子表达式匹配的文本。
index 属性声明的是匹配文本的起始字符在 string 中的位置。
input 属性声明的是对 string 的引用。
有全局g标志
const regexp = /hello/
const str = 'hello abc , ceshihelloabc, abc hello'
const x = str.match(regexp)
console.log(x)
结果如下图:
如果 regexp 具有标志 g,则 match() 方法将执行全局检索,找到 string 中的所有匹配子字符串。若没有找到任何匹配的子串,则返回 null。如果找到了一个或多个匹配子串,则返回一个数组。不过全局匹配返回的数组的内容与前者大不相同,它的数组元素中存放的是 string 中所有的匹配子串,而且也没有 index 属性或 input 属性。
2、正则exec方法
有无全局g标志都一样
const regexp = /hello/
const str = 'hello abc , ceshihelloabc, abc hello'
const x = regexp.exec(str)
console.log(x)
如上,无论regexp是否全局模式,exec方法返回的都是一样的,而且与string.match()的非全局模式返回的结果是一致的。
全局模式下循环调用exec
在实际中,我们通常可以通过循环调用exec方法找到所有匹配的值。
const regexp = /hello/g
const str = 'hello abc , ceshihelloabc, abc hello'
let count = 0
while (x = regexp.exec(str)) {
console.log(x)
count++
}
console.log(count)
结果如下图:
3、字符串replace方法
function replacer(match, p1, p2, p3, p4, offset, string) {
return [match, p1, p2, p3, p4, offset, string].join('---:')
}
const regexp = /("translate\()(\d+)(,\s)(\d+)/
const str = 'transform="translate(10, 20)"'
const x = str.match(regexp)
console.log(x)
if(x) {
console.log(str.replace(regexp, '1--$1, 2--$2, 3--$3, 4--$4'))
console.log(str.replace(regexp, replacer))
}
结果如下图:
在String.replace()方法中,第二个参数可以是字符串或函数。两种方式都有变量名代表匹配的值,如上所示参考文档