ES2018 新特性
正则表达式反向(lookbehind)断言(本文)
正则表达式 Unicode 转义
正则表达式 s/dotAll 模式
正则表达式命名捕获组
对象展开运算符
Promise.prototype.finally
“正则表达式反向断言” 提案 proposal-regexp-lookbehind 由 Gorkem Yakin, Nozomu Katō, Daniel Ehrenberg 负责,目前已经进入 stage 4,预计会是 ES9(ES2018) 的一部分。
1. 概述
断言(Assertion)是一个对当前匹配位置之前或之后的字符的测试, 它不会实际消耗任何字符,所以断言也被称为“非消耗性匹配”或“非获取匹配”。
正则表达式的断言一共有 4 种形式:
(?=pattern)
零宽正向肯定断言(zero-width positive lookahead assertion)(?!pattern)
零宽正向否定断言(zero-width negative lookahead assertion)(?<=pattern)
零宽反向肯定断言(zero-width positive lookbehind assertion)(?<!pattern)
零宽反向否定断言(zero-width negative lookbehind assertion)
这里面的 pattern 是一个正则表达式。
lookahead 和 lookbehind 通过被翻译为:
正向 负向
前向 后向
正向 反向
前瞻 后瞻
……
本文档使用“正向”、“反向”。
2. Lookahead assertions 正向断言
在当前的 JavaScript 正则表达式版本中,只支持正向断言。
正向断言的意思是:当前位置后面的字符串应该满足断言,但是并不捕获,仅此而已。
举个例子:
const regex = /just(?=java)/;
这个正则表达式可以匹配 "justjava"
,但是正则表达式匹配到的字符串不包含 "java"
。(这个正则表达式可以匹配 "justjavac"
中的 "just"
,注意,匹配的结果是 just
,并不是 "justjavac"
)
const match1 = regex.exec('justjavac');
console.log(match1[0]); // 结果是 just
但是如果这个字符串没有包含