正则表达式中的零宽度断言
        【摘要】 在正则表达式中,?=、?<=、?!、?<! 是用于实现零宽度断言(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" 中) | 
注意事项
- 零宽度:这些断言不消耗字符,仅进行条件判断,因此匹配结果中不会包含 
B。 - 性能:复杂的断言可能影响正则表达式的性能,尤其是在处理长文本时。
 - 浏览器/引擎支持:大多数现代正则引擎(如 PCRE、JavaScript、Python 的 
re模块)都支持这些语法,但某些旧版本或简单实现可能不支持。 
实际应用示例
- 匹配不以 
http://开头的 URL:(?<!http://)\b\w+\.\w+\b - 匹配密码中的大写字母(但不包含在结果中):
(这里(?=.*[A-Z]).{6,}(?=.*[A-Z])确保密码中至少有一个大写字母,但实际匹配的是整个密码。) 
            【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
                cloudbbs@huaweicloud.com
                
            
        
        
        
        
        
        
        - 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)