正则表达式中的零宽度断言

举报
福州司马懿 发表于 2025/09/22 00:25:58 2025/09/22
【摘要】 在正则表达式中,?=、?<=、?!、?<! 是用于实现零宽度断言(Zero-Width Assertions)的语法,也被称为前瞻(Lookahead)和后瞻(Lookbehind)。它们允许你在不消耗字符(即不将匹配内容包含在结果中)的情况下,对匹配位置前后的文本进行条件判断。以下是它们的具体区别和使用场景: 1. ?=(正向先行断言,Positive Lookahead)语法:A(?=B...

在正则表达式中,?=?<=?!?<! 是用于实现零宽度断言(Zero-Width Assertions)的语法,也被称为前瞻(Lookahead)后瞻(Lookbehind)。它们允许你在不消耗字符(即不将匹配内容包含在结果中)的情况下,对匹配位置前后的文本进行条件判断。以下是它们的具体区别和使用场景:

1. ?=(正向先行断言,Positive Lookahead)

  • 语法A(?=B)
  • 含义:匹配 A,但仅当 A 后面紧跟着 B 时。B 不会被包含在匹配结果中。
  • 示例
    • 正则表达式:\d(?=px)
    • 匹配:"5px" 中的 "5"(因为 "5" 后面是 "px")。
    • 不匹配:"5em" 中的 "5"(因为后面不是 "px")。
  • 用途:常用于匹配特定上下文中的字符,如单位、后缀等。

2. ?!(负向先行断言,Negative Lookahead)

  • 语法A(?!B)
  • 含义:匹配 A,但仅当 A 后面 紧跟着 B 时。B 不会被包含在匹配结果中。
  • 示例
    • 正则表达式:\d(?!px)
    • 匹配:"5em" 中的 "5"(因为 "5" 后面不是 "px")。
    • 不匹配:"5px" 中的 "5"(因为后面是 "px")。
  • 用途:常用于排除特定上下文中的字符。

3. ?<=(正向后行断言,Positive Lookbehind)

  • 语法(?<=B)A
  • 含义:匹配 A,但仅当 A 前面是 B 时。B 不会被包含在匹配结果中。
  • 示例
    • 正则表达式:(?<=\$)\d+
    • 匹配:"$100" 中的 "100"(因为 "100" 前面是 "$")。
    • 不匹配:"100" 中的 "100"(因为前面没有 "$")。
  • 用途:常用于匹配特定前缀后的字符,如货币符号后的数字。

4. ?<!(负向后行断言,Negative Lookbehind)

  • 语法(?<!B)A
  • 含义:匹配 A,但仅当 A 前面 不是 B 时。B 不会被包含在匹配结果中。
  • 示例
    • 正则表达式:(?<!\$)\d+
    • 匹配:"100" 中的 "100"(因为 "100" 前面不是 "$")。
    • 不匹配:"$100" 中的 "100"(因为前面是 "$")。
  • 用途:常用于排除特定前缀后的字符。

总结对比

语法 名称 方向 条件 示例(匹配 "A" 的条件)
?= 正向先行断言 向前 后面是 B \d(?=px)"5"(在 "5px" 中)
?! 负向先行断言 向前 后面不是 B \d(?!px)"5"(在 "5em" 中)
?<= 正向后行断言 向后 前面是 B (?<=\$)\d+"100"(在 "$100" 中)
?<! 负向后行断言 向后 前面不是 B (?<!\$)\d+"100"(在 "100" 中)

注意事项

  1. 零宽度:这些断言不消耗字符,仅进行条件判断,因此匹配结果中不会包含 B
  2. 性能:复杂的断言可能影响正则表达式的性能,尤其是在处理长文本时。
  3. 浏览器/引擎支持:大多数现代正则引擎(如 PCRE、JavaScript、Python 的 re 模块)都支持这些语法,但某些旧版本或简单实现可能不支持。

实际应用示例

  • 匹配不以 http:// 开头的 URL
    (?<!http://)\b\w+\.\w+\b
    
  • 匹配密码中的大写字母(但不包含在结果中)
    (?=.*[A-Z]).{6,}
    
    (这里 (?=.*[A-Z]) 确保密码中至少有一个大写字母,但实际匹配的是整个密码。)
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。