正则表达式是计算机科学领域中的一种基础工具,用于匹配文本中的内容。而在 ES12(也称为 ECMAScript 2021)中,正则表达式新增加了一种重要的特性:断言。这一特性能够帮助我们更加灵活地匹配文本内容。
什么是断言?
断言是一种正则表达式的语法结构,通常用于强制需要一些文本内容的前缀或者后缀、或者它们没有对应的前缀或者后缀时进行匹配。在断言中,我们可以使用 (?=
,?!
,(?<=
和 (?<!
这四个符号来进行匹配。
在进行断言匹配时,如果断言部分匹配成功,它并不会消耗文本内容。相反,正则表达式将会从它开始的下一个字符继续匹配。
向前查找断言
向前查找断言使用的是 (?=
符号,表示需要在文本中查找匹配该断言的内容,并匹配成功的情况下,该断言所在的位置后面的字符才能被匹配。下面是一个示例:
// 匹配至少一个数字,但不要匹配数字后的冒号 const str = '123:456'; const re = /\d+(?=:)/; console.log(re.exec(str)); // ['123']
在上述代码中,通过使用 (?=:)
向前查找断言,我们在匹配数字的过程中避免了匹配数字后面的冒号。
否定向前查找断言
否定向前查找断言使用的是 (?!)
符号,表示需要在文本中查找没有匹配该断言的内容。下面是一个示例:
// 匹配不带有字符串 'e' 的单词 const str = 'apple bananas'; const re = /\b[^\s]+(?!\S*e\S*)\b/; console.log(re.exec(str)); // ['bananas']
在上述代码中,通过使用 (?!\S*e\S*)
否定向前查找断言,我们在匹配不带有字符串 'e' 的单词时避免了匹配到 'apple'。
向后查找断言
向后查找断言使用的是 (?<=)
符号,表示需要在文本中查找匹配该断言的内容,并匹配成功的情况下,该断言所在的位置前面的字符才能被匹配。下面是一个示例:
// 从十六进制数字串中匹配连续重复的数字 const str = 'FF00FF'; const re = /(?<=(\w))\1{2}/g; console.log(str.match(re)); // ['FF']
在上述代码中,通过使用 (?<=(\w))\1{2}
向后查找断言,我们成功得到了 'FF' 这个连续重复的十六进制数字串。
否定向后查找断言
否定向后查找断言使用的是 (?<!)
符号,表示需要在文本中查找没有匹配该断言的内容。下面是一个示例:
// 匹配 URL 中的目录路径 const str = 'http://www.example.com/xyz/abc.html'; const re = /(?<=\/\/)[^/]+(?=\/[^/]*$)/; console.log(re.exec(str)); // 'www.example.com'
在上述代码中,通过使用 (?<=\/\/)[^/]+(?=\/[^/]*$)
否定向后查找断言,我们成功地匹配了 URL 的目录路径。
总结
正则表达式的断言是 ES12 中的一个重要特性,能够帮助我们更加灵活地匹配文本内容。在断言中,我们可以使用 (?=
,?!
,(?<=
和 (?<!
这四种符号来进行匹配。在实际的应用场景中,我们可以通过结合断言来匹配需要的文本内容。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654864ff7d4982a6eb2aaac4