在 ECMAScript 2018 标准(ES9)中,正则表达式得到了强化,其中一个新增的功能是查找(Lookbehind)断言(Assertion),可以让我们在正则表达式匹配时向前查找。
什么是 Lookbehind 断言?
Lookbehind 断言是一种正则表达式的特殊组成部分,用于在匹配某个字符时,从它之前的位置开始匹配,而不是从当前位置向后进行匹配。
这种特殊的匹配方式可以让我们实现更为复杂的正则表达式匹配,例如查找某个字符前面是否有另一个字符并判断其特定的位置。Lookbehind 断言可以分为两种类型:
- 正向查找(Positive Lookbehind Assertions):只有当前位置之前有指定的字符串时,才匹配成功;
- 负向查找(Negative Lookbehind Assertions):只有当前位置之前没有指定的字符串时,才匹配成功。
Lookbehind 断言的语法
Lookbehind 断言的语法如下:
/(?<=pattern)sub-pattern/ /(?<!pattern)sub-pattern/
其中,pattern
表示要匹配的字符串,sub-pattern
表示要查找的字符。
另外,如果使用了 Lookbehind 断言,需要注意以下限制:
- Lookbehind 断言必须满足固定长度,也就是说,无法使用通配符或量词;
- Lookbehind 断言必须在当前位置的左边查找,也就是说,只能用于正则表达式中的第二个组成部分。
使用 Lookbehind 断言
下面,我们通过一些示例代码来演示在实际中如何使用 Lookbehind 断言。
正向查找示例
假设我们要查找一个字符串中所有的“CSS”单词,并且只匹配它前面为数字、字母或下划线的情况。这时,我们可以使用如下的正则表达式:
const str = "CSS is cool, CSS123 too!"; const regex = /(?<=[\w\d])CSS/g; // 匹配前面为字母或数字的 CSS 单词 console.log(str.match(regex)); // ["CSS", "CSS"]
在上面的例子中,我们使用正向查找 (?<=)
来判断要匹配的字符串前面是否为字母或数字,这样可以避免匹配到 CSS 单词前面的空格或其他字符。
负向查找示例
接下来,我们来演示一下负向查找的情况。假设我们要查找一个字符串中所有不以“#”打头的 URL,这时我们可以使用如下的正则表达式:
const str = "https://www.baidu.com #my-link"; const regex = /(?<!#)https?:\/\/\S+/g; // 不匹配以 # 开头的 URL console.log(str.match(regex)); // ["https://www.baidu.com"]
在上面的例子中,我们使用负向查找 (?<!)
来判断 URL 前面是否以“#”打头,这样可以避免匹配到以“#”打头的 URL。
总结
Lookbehind 断言为我们提供了一种新的方法来查找字符串,可以更加准确地匹配指定位置的字符。通过本篇文章的学习,我们可以开始使用 Lookbehind 断言来构建更为复杂的正则表达式,丰富前端开发中的工具库。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64506889980a9b385b9753fa