正则表达式的前瞻、后顾和原子分组
正则表达式的前瞻、后顾和原子分组
我在我的正则表达式中找到了这些东西,但我不知道可以用它们来做什么。
有人有例子可以让我尝试理解它们是如何工作的吗?
(?!) - negative lookahead (?=) - positive lookahead (?<=) - positive lookbehind (?<!) - negative lookbehind (?>) - atomic group
回顾是零宽断言。它们检查当前位置左侧或右侧的正则表达式是否匹配(基于之前或之后),当找到匹配时成功或失败(基于是正面还是反面),并且丢弃匹配的部分。它们不消耗任何字符——它们后面(如果有的话)的正则表达式的匹配将从同一光标位置开始。
请阅读regular-expression.info以获取更多细节。
- 正面回顾:
语法:
(?=REGEX_1)REGEX_2
只有在REGEX_1匹配的情况下才匹配;匹配REGEX_1之后,丢弃匹配并从同一位置开始搜索REGEX_2。
例子:
(?=[a-z0-9]{4}$)[a-z]{1,2}[0-9]{2,3}
REGEX_1是[a-z0-9]{4}$
,它匹配四个字母数字后面加上一行结束符。
REGEX_2是[a-z]{1,2}[0-9]{2,3}
,它匹配一个或两个字母,后面跟着两个或三个数字。
REGEX_1确保字符串的长度确实为4,但不消耗任何字符,以便搜索REGEX_2从同一位置开始。现在REGEX_2确保字符串符合其他规则。如果没有前瞻,它将匹配长度为三或五的字符串。
- 负面回顾
语法:
(?!REGEX_1)REGEX_2
只有在REGEX_1不匹配时才匹配;检查REGEX_1后,搜索REGEX_2从同一位置开始。
例子:
(?!.*\bFWORD\b)\w{10,30}$
前瞻部分检查字符串中是否存在FWORD
,如果找到则失败。如果没有找到FWORD
,前瞻就成功了,以下部分验证字符串的长度介于10到30之间,并且仅包含单词字符a-zA-Z0-9_
回顾先行断言和回顾后行断言相似:它只是查看当前光标位置之前的内容。一些正则表达式味道,如javascript不支持回顾后行断言。而大多数支持它的味道(PHP,Python等)要求回顾后面的部分具有固定的长度。
- 原子组基本上会在令牌匹配后舍弃/忘记组中的后续令牌。查看此页面以获取有关原子组的示例原子组
示例
给定字符串 foobarbarfoo
:
bar(?=bar) finds the 1st bar ("bar" which has "bar" after it) bar(?!bar) finds the 2nd bar ("bar" which does not have "bar" after it) (?<=foo)bar finds the 1st bar ("bar" which has "foo" before it) (?
您也可以将它们组合起来:
(?<=foo)bar(?=bar) finds the 1st bar ("bar" with "foo" before it and "bar" after it)
定义
正向先行断言
(?=)
查找表达式 A,而表达式 B 位于其后:
A(?=B)
负向先行断言
(?!)
查找表达式 A,而表达式 B 不位于其后:
A(?!B)
正向后行断言
(?<=)
查找表达式 A,而表达式 B 位于其前:
(?<=B)A
负向后行断言
(?
查找表达式 A,而表达式 B 不位于其前:
(?
原子组
(?>)
原子组存在于一组中并在第一个匹配的模式之后丢弃所有备用模式(回溯被禁用)。
(?>foo|foot)s
应用于foots
将匹配它的第一个备选项foo
,然后由于s
不紧跟,在回溯禁用的情况下将失败并停止
非原子组允许回溯;如果随后的匹配失败,则会回溯并使用备用模式,直到找到整个表达式的匹配项或穷尽所有可能性为止。
-
(foo|foot)s
应用于foots
将:- 匹配它的第一个备选项
foo
,然后由于在foots
中没有紧随其后,将失败并回溯到其第二个备选项; - 匹配它的第二个备选项
foot
,然后由于s
立即紧跟在foots
中,将成功并停止。
- 匹配它的第一个备选项