正则表达式正向肯定断言
正则表达式正向肯定断言
1. 定义
正向肯定断言(Positive Lookaround)是一种零宽断言,用于在正则表达式中匹配一个位置,该位置的右侧(前瞻)或左侧(后顾)必须满足给定的子模式,但断言本身不消耗字符,也不会出现在匹配结果中。
它分为两种:
- 正向肯定前瞻(Positive Lookahead):
(?=...) - 正向肯定后顾(Positive Lookbehind):
(?<=...)
2. 解释
- 零宽度:断言只检查条件,不实际匹配字符,因此匹配结果中只包含断言之前/之后的部分。
- 肯定性:要求条件成立(即子模式必须出现)。
- 方向性:
- 前瞻:向前看,确保当前位置之后存在指定模式。
- 后顾:向后看,确保当前位置之前存在指定模式。
3. 语法
| 类型 | 语法 | 示例 | 含义 |
|---|---|---|---|
| 正向肯定前瞻 | (?=...) |
\d+(?= dollars) |
匹配后面跟着 " dollars" 的数字 |
| 正向肯定后顾 | (?<=...) |
(?<=\$)\d+ |
匹配前面有 $ 符号的数字 |
4. 用例
4.1 正向肯定前瞻示例
需求:从文本 "Price: 100 dollars, Discount: 20 euros" 中提取以 "dollars" 为单位的数字。
正则:\d+(?= dollars)
匹配结果:100 (20 后面是 " euros",所以不匹配)
解释:\d+ 匹配数字,但只有在其后面紧跟着 " dollars" 时才成功。
4.2 正向肯定后顾示例
需求:从文本 "USD: 100, EUR: 200" 中提取以 "USD: " 开头的数字。
正则:(?<=USD: )\d+
匹配结果:100 (200 前面是 "EUR: ",不匹配)
解释:\d+ 匹配数字,但要求其前面必须是 "USD: "。
4.3 组合使用
需求:匹配同时满足前后条件的单词(例如,被引号包围的单词)。
文本:"hello" world "regex"
正则:(?<=")[^"]+(?=")
匹配结果:hello 和 regex
解释:(?<=") 确保当前位置前是双引号,[^"]+ 匹配非引号字符,(?=") 确保当前位置后是双引号。
5. 用法
5.1 在编程语言中使用
Python 示例
import re
text = "The price is 100 dollars and 20 euros."
# 正向肯定前瞻:匹配后面有 " dollars" 的数字
pattern = r'\d+(?= dollars)'
matches = re.findall(pattern, text)
print(matches) # 输出: ['100']
# 正向肯定后顾:匹配前面有 "price is " 的数字
pattern2 = r'(?<=price is )\d+'
matches2 = re.findall(pattern2, text)
print(matches2) # 输出: ['100']
JavaScript 示例
const text = "The price is 100 dollars and 20 euros.";
// 正向肯定前瞻
const matches = text.match(/\d+(?= dollars)/g);
console.log(matches); // 输出: ["100"]
// 正向肯定后顾(注意:旧版浏览器可能不支持)
const matches2 = text.match(/(?<=price is )\d+/g);
console.log(matches2); // 输出: ["100"]
5.2 注意事项
后顾支持:某些正则引擎(如早期JavaScript)不支持后顾断言。现代环境(ES2018+)已支持。
贪婪与懒惰:断言内的模式可以使用量词,但断言本身不消耗字符,因此不会影响匹配的起始/结束位置。
复杂嵌套:断言可以嵌套,但会增加复杂度,应谨慎使用。
6. 总结
正向肯定断言是正则表达式中强大的工具,用于基于上下文进行精确匹配,而不将上下文包含在结果中。掌握它能够写出更简洁、高效的模式。
学如逆水行舟,不进则退

浙公网安备 33010602011771号