在 ES12 中,正则表达式又有了新特性:断言(assertion)。断言可以让我们更加精确地匹配字符串,在某些情况下能够大大简化正则表达式的编写。
什么是断言
断言是一种特殊的正则表达式语法,它可以匹配一个位置,而不是匹配一个字符。换句话说,它可以让我们确认某个位置前面或后面的内容是否满足一定的条件。
正向肯定断言
正向肯定断言是最基本的断言之一,它使用 (?=...)
的语法来匹配一个前面满足特定条件的位置。比如,我们可以使用正向肯定断言来匹配一个字符串中后面紧跟着数字的位置:
const text = 'hello123world'; const pattern = /(?=\d)/; console.log(text.search(pattern)); // 输出 5
在上面的例子中,我们使用 (?=\d)
来匹配后面紧跟着数字的位置, search()
方法返回了 5,表示正则表达式匹配到了这个位置。
正向否定断言
正向否定断言是正向肯定断言的反面,它使用 (?!...)
的语法来匹配一个前面不满足特定条件的位置。比如,我们可以使用正向否定断言来匹配一个字符串中后面不是数字的位置:
const text = 'hello123world'; const pattern = /(?!\d)/; console.log(text.search(pattern)); // 输出 0
在上面的例子中,我们使用 (?!\d)
来匹配后面不是数字的位置, search()
方法返回了 0,表示正则表达式匹配到了这个位置。
反向肯定断言
和正向肯定断言类似,反向肯定断言使用 (?<=...)
的语法来匹配一个后面满足特定条件的位置。比如,我们可以使用反向肯定断言来匹配一个字符串中前面紧贴着数字的位置:
const text = 'hello123world'; const pattern = /(?<=\d)/; console.log(text.search(pattern)); // 输出 5
在上面的例子中,我们使用 (?<=\d)
来匹配前面紧贴着数字的位置, search()
方法返回了 5,表示正则表达式匹配到了这个位置。
反向否定断言
反向否定断言使用 (?<!...)
的语法来匹配一个后面不满足特定条件的位置。比如,我们可以使用反向否定断言来匹配一个字符串中前面不是数字的位置:
const text = 'hello123world'; const pattern = /(?<!\d)/; console.log(text.search(pattern)); // 输出 0
在上面的例子中,我们使用 (?<!\d)
来匹配前面不是数字的位置, search()
方法返回了 0,表示正则表达式匹配到了这个位置。
应用场景
断言不仅能够让我们更加精确地匹配字符串,还能够大大简化正则表达式的编写。比如,我们可以使用断言来匹配一个字符串中所有不在括号内的单词:
const text = 'hello (world)'; const pattern = /\b\w+\b(?![^(]*\))/g; console.log(text.match(pattern)); // 输出 ["hello"]
在上面的例子中,我们使用 \b\w+\b
来匹配一个单词,然后通过 (?![^(]*\))
来排除在括号内的单词。
总结
断言是 ES12 中新加入的正则表达式特性,它可以让我们更加精确地匹配字符串,在某些情况下能够大大简化正则表达式的编写。本文介绍了四种常见的断言语法:正向肯定断言、正向否定断言、反向肯定断言和反向否定断言,并举了一些实际应用的例子。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6454c5d3968c7c53b088ab14