正则表达式正向肯定断言

正则表达式正向肯定断言

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. 总结

正向肯定断言是正则表达式中强大的工具,用于基于上下文进行精确匹配,而不将上下文包含在结果中。掌握它能够写出更简洁、高效的模式。

posted @ 2026-03-04 09:12  兰溪三日桃花雨  阅读(53)  评论(0)    收藏  举报