正则表达式中的零宽度断言
【摘要】 在正则表达式中,?=、?<=、?!、?<! 是用于实现零宽度断言(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)