更优雅地使用 ES9 中的正则表达式 lookbehind 断言
正则表达式是一种强大的文本搜索工具,用于在字符串中匹配特定的模式。ES9中提供了 lookbehind 断言,它允许你搜索前面的文本而不捕获它。这篇文章将带你了解这种新功能,并提供一些实用的示例,帮助你更好地掌握正则表达式。
- 什么是 lookbehind 断言?
在正则表达式中,断言是指在搜索特定模式之前或之后,需要满足另一模式的条件。lookbehind 就是一种后向断言,表示搜索模式必须先满足一个匹配模式才能继续向后搜索。
ES9 的 lookbehind 断言分为两种:
① 顺序断言:(?<=pattern) 表示要匹配 的字符串必须在 pattern 匹配的字符串之后。
② 反向断言:(?<!pattern) 表示要匹配的字符串不得在pattern匹配的字符串之后。
- 实例讲解
2.1 顺序断言
例如,让我们尝试匹配前面的字符串“JS”,但仅当它在 ex 前面出现时才匹配。传统的正则表达式不能处理这种情况,但我们可以使用 ES9 中的 lookbehind 断言来做到这一点:
/(?<=ex)JS/
该正则表达式将匹配以下字符串:“regex” 和 “text”,但不包括 “JS” 在 ex 之后的所有字符串。
我们还可以使用 lookbehind 来实现更复杂的样式匹配。例如,我们想匹配所有在如下文本中出现但不在两个引号之间的数字:
Example: 1, 12, 123, 1234, "12345"
正常的正则表达式可以使用否定前向斜杠来编写,例如:
/(?<!")(?<!')\d+(?!.")(?!.')/
但这里的 lookbehind 断言可以使正则表达式更加简洁,如下所示:
/(?<!["'])\d+(?![^"']*["'])/
其中 (?<!["']) 表示确保之前没有出现单引号或双引号,\d+ 表示匹配一个或多个数字,(?![^"']*["'])表示确保不在引号中。这种方式更易于阅读和理解。
2.2 反向断言
反向断言让查找更加有趣,并且在需要排除某个模式时非常有用。例如,我们想匹配所有不在链接中的 email 地址,并且在 @ 符号前面没有足够的空格。我们可以写出这个正则表达式:
/(?<!href=")S+@\S+/
其中,(?<!href=") 确保链接中的 email 地址不匹配,\S+@ 匹配地址中的 @ 符号以及至少一个字符,然后 \S+ 匹配其余的地址。除了 href=" 之外,这个正则表达式将匹配任何其他模式,这是我们想要的。
该正则表达式将匹配以下文本:
<a href="example@test.com">此电子邮件地址已受保护</a> <a>example@test.com</a>
但不会匹配此文本:
<a href="mailto:example@test.com">此电子邮件地址已受保护</a>
- 总结和注意事项
在 ES9 中使用 lookbehind 断言可以使正则表达式更具可读性、更简洁,并且让复杂的模式匹配更加容易。要注意,浏览器兼容性问题,某些浏览器可能不支持该功能。
通过本文的介绍,相信您已经掌握了工作中使用 lookbehind 断言的技巧,并能更好地应用它们来加速您的开发。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c0f75183d39b488155300d