js正则中的断言(assertion)的使用

384 阅读2分钟

在JavaScript中,正则表达式的断言(assertions)是一种强大的特性,它允许我们指定一个模式必须出现或不出现在另一个指定模式的前面或后面,而不消耗任何字符。断言分为四种类型:

  • 正向前行断言(lookahead)
  • 负向前行断言(negative lookahead)
  • 正向后行断言(lookbehind)
  • 和负向后行断言(negative lookbehind)

正向前行断言 (?=pattern)

用于匹配紧跟在特定模式后面的字符串。相对地,

负向前行断言 (?!pattern) 

确保某个模式后面不是另一个特定模式。这些断言检查发生在当前匹配点之后的文本。

另一方面,

正向后行断言 (?<=pattern)

用于匹配仅当前面是特定模式时的字符串。

而负向后行断言 (?<!pattern)

确保匹配的字符串前面不是指定的模式。这些断言检查发生在当前匹配点之前的文本。


断言不会成为匹配结果的一部分,它们仅仅是条件。这使得断言成为进行复杂文本分析时的有力工具,可以用于密码验证、数据解析等场景,提高了正则表达式的灵活性和表现力。

以下是4中断言用法的demo

/**
* ## 零宽正向前行断言(zero-width positive lookahead assertion)
* 格式: (?=pattern)
* @example bar(?=foo)
*/
[..."barfoo barfo barfoofoo".matchAll(/bar(?=foo)/g)]
// 输出↑          ↑
//['bar', index: 0, input: 'barfoo barfo barfoofoo', groups: undefined]
//['bar', index: 13, input: 'barfoo barfo barfoofoo', groups: undefined]
//-----------------------------------------------------------------------


/**
* ## 零宽负向前行断言(zero-width negative lookahead assertion)
* 格式: (?!pattern)
* @example bar(?!foo)
*/
[..."barfoo bar barfoo".matchAll(/bar(?!foo)/g)]
// 输出     ↑
//['bar', index: 7, input: 'barfoo bar barfoo', groups: undefined]
// 可以用来匹配不以foo1结尾的字符串,或者不包含foo1的字符串
// 不以foo1结尾: ^(?!.*foo1$).*
// 不包含 foo1: ^(?!.*foo1).*
//-----------------------------------------------------------------------


/**
* ## 零宽正向后行断言(zero-width positive lookbehind assertion)
* 格式: (?<=pattern)
* @example (?<=foo)bar
*/
[..."foobar bara afoobar".matchAll(/(?<=foo)bar/g)]
// 输出 ↑            ↑
//['bar', index: 3, input: 'foobar bara afoobar', groups: undefined]
//['bar', index: 16, input: 'foobar bara afoobar', groups: undefined]
//-----------------------------------------------------------------------


/**
* ## 零宽负向后行断言(zero-width negative lookbehind assertion)
* 格式: (?<!pattern)
* @example (?<!foo)bar
*/
[..."foobar bar afoobar".matchAll(/(?<!foo)bar/g)]
// 输出     ↑
//['bar', index: 7, input: 'foobar bar afoobar', groups: undefined]