(?=a) 代表什么意思!

(?=a)非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。

还有四个和这个相近的:

(?!a)非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。
(?:a)非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。
(?<=a)非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。
(?<!a)非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。

以上是官方的定义,比较难懂,我用自己的理解翻译了一下:

(?=a) 表示我们需要匹配某样东西的前面。
(?!a) 表示我们需要不匹配某样东西。
(?:a) 表示我们需要匹配某样东西本身。
(?<=a) 表示我们需要匹配某样东西的后面。
(?<!a) 表示我们需要不匹配某样东西,与(?!a)方向相反。

我的翻译可能还是不太容易理解,我们用代码来解释一下!

1
2
3
4
5
6
7
8
9
10
console.log("我是中国人".replace(/我是(?=中国)/, "rr")) // 输出: 'rr中国人',匹配的是中国前面的'我是'

console.log("我是中国人".replace(/(?!中国)/, "rr")) // 输出:'rr我是中国人'

console.log("我是中国人".replace(/(?:中国)/, "rr")) // 输出:'我是rr人',匹配'中国'本身

console.log("我是中国人".replace(/(?<=中国)人/, "rr")) // 输出:'我是中国rr',匹配的是中国后面的'人'

console.log("我是中国人".replace(/(?<!中国)/, "rr")) // 输出:'rr我是中国人'

Tips:(?!a)和(?<!a)都是输出的 ‘rr我是中国人’,我的理解是,replace替换的时候匹配得是不包含中国的字符串,但是这个字符串又没有,那么js自动给加前面去了。


先行断言

x(?=y)称为先行断言(Positive look-ahead),x只有在y前面才匹配,y不会被计入返回结果。比如,要匹配后面跟着百分号的数字,可以写成/\d+(?=%)/。

“先行断言”中,括号里的部分是不会返回的。

1
2
var m = 'abc'.match(/b(?=c)/);
m // ["b"]

上面的代码使用了先行断言,b在c前面所以被匹配,但是括号对应的c不会被返回。

先行否定断言

x(?!y)称为先行否定断言(Negative look-ahead),x只有不在y前面才匹配,y不会被计入返回结果。比如,要匹配后面跟的不是百分号的数字,就要写成/\d+(?!%)/。

1
2
/\d+(?!\.)/.exec('3.14') // ["14"]
// ["14"]

上面代码中,正则表达式指定,只有不在小数点前面的数字才会被匹配,因此返回的结果就是14。

“先行否定断言”中,括号里的部分是不会返回的。

1
2
var m = 'abd'.match(/b(?!c)/);
m // ['b']

上面的代码使用了先行否定断言,b不在c前面所以被匹配,而且括号对应的d不会被返回。

参考链接JavaScript教程



愿你的坚持终有收获。