JavaScript中正则表达式-- (?=a)、先行断言、现行否定断言
(?=a) 代表什么意思!
(?=a)非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。
还有四个和这个相近的:
(?!a)非获取匹配,正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。
(?:a)非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。
(?<=a)非获取匹配,反向肯定预查,与正向肯定预查类似,只是方向相反。
(?<!a)非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。
以上是官方的定义,比较难懂,我用自己的理解翻译了一下:
(?=a) 表示我们需要匹配某样东西的前面。
(?!a) 表示我们需要不匹配某样东西。
(?:a) 表示我们需要匹配某样东西本身。
(?<=a) 表示我们需要匹配某样东西的后面。
(?<!a) 表示我们需要不匹配某样东西,与(?!a)方向相反。
我的翻译可能还是不太容易理解,我们用代码来解释一下!
1 | console.log("我是中国人".replace(/我是(?=中国)/, "rr")) // 输出: 'rr中国人',匹配的是中国前面的'我是' |
Tips:(?!a)和(?<!a)都是输出的 ‘rr我是中国人’,我的理解是,replace替换的时候匹配得是不包含中国的字符串,但是这个字符串又没有,那么js自动给加前面去了。
先行断言
x(?=y)称为先行断言(Positive look-ahead),x只有在y前面才匹配,y不会被计入返回结果。比如,要匹配后面跟着百分号的数字,可以写成/\d+(?=%)/。
“先行断言”中,括号里的部分是不会返回的。
1 | var m = 'abc'.match(/b(?=c)/); |
上面的代码使用了先行断言,b在c前面所以被匹配,但是括号对应的c不会被返回。
先行否定断言
x(?!y)称为先行否定断言(Negative look-ahead),x只有不在y前面才匹配,y不会被计入返回结果。比如,要匹配后面跟的不是百分号的数字,就要写成/\d+(?!%)/。
1 | /\d+(?!\.)/.exec('3.14') // ["14"] |
上面代码中,正则表达式指定,只有不在小数点前面的数字才会被匹配,因此返回的结果就是14。
“先行否定断言”中,括号里的部分是不会返回的。
1 | var m = 'abd'.match(/b(?!c)/); |
上面的代码使用了先行否定断言,b不在c前面所以被匹配,而且括号对应的d不会被返回。
参考链接JavaScript教程
愿你的坚持终有收获。
Use this card to join the candyhome and participate in a pleasant discussion together .
Welcome to aqing's candyhome,wish you a nice day .