正则表达式 - 正向断言和反向断言
在正则表达式中,断言(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+)。
