在正则表达式中,断言(Assertions) 是一种“零宽匹配”结构,它不匹配具体的字符,而是匹配一个“位置”,这个位置需要满足某些条件(比如该位置前后有特定内容)。断言的核心作用是“限定目标内容的上下文环境”,但不会消耗字符串中的字符。

正向断言(先行断言):判断“后面”是否满足条件

正向断言(Positive Lookahead Assertion)的语法是 (?=pattern),表示:当前位置的后面必须能匹配 pattern,但 pattern 本身不会被计入最终的匹配结果。

简单说:“找一个内容A,要求A的后面是内容B”,A是要匹配的目标,B是正向断言的条件。

反向断言(后行断言):判断“前面”是否满足条件

反向断言(Positive Lookbehind Assertion)的语法是 (?<=pattern),表示:当前位置的前面必须能匹配 pattern,但 pattern 本身不会被计入最终的匹配结果。

简单说:“找一个内容A,要求A的前面是内容B”,A是要匹配的目标,B是反向断言的条件。

结合你的示例分析

你的字符串是:let str = 'JS5211314你知道么555啦啦啦';

1. 正向断言:/\d+(?=啦)/
  • 目标:匹配 1个或多个数字(\d+)
  • 条件:这些数字的 后面必须紧跟着“啦”((?=啦))

在字符串 'JS5211314你知道么555啦啦啦' 中:

  • 数字 5211314 后面是 '你',不满足“后面是啦”,所以不匹配;
  • 数字 555 后面是 '啦'(555 紧接着 '啦啦啦'),满足条件,因此匹配 555。

执行 reg.exec(str) 会返回 ['555', index: 11, input: 'JS5211314你知道么555啦啦啦', groups: undefined]。

2. 反向断言:/(?<=么)\d+/
  • 目标:匹配 1个或多个数字(\d+)
  • 条件:这些数字的 前面必须紧跟着“么”((?<=么))

在字符串中:

  • 数字 555 前面是 '么'('你知道么' 后面是 555),满足条件,因此匹配 555;
  • 数字 5211314 前面是 'JS',不满足“前面是么”,所以不匹配。

执行 reg.exec(str) 同样会返回 ['555', index: 11, input: 'JS5211314你知道么555啦啦啦', groups: undefined]。

总结

  • 正向断言 (?=pattern):限定“目标内容的后面必须有 pattern”;
  • 反向断言 (?<=pattern):限定“目标内容的前面必须有 pattern”;
  • 两者都是“零宽匹配”,只判断位置,不消耗字符,最终匹配结果只包含目标内容(示例中的 \d+)。

更多推荐