正则表达式的前瞻、后顾和原子分组

20 浏览
0 Comments

正则表达式的前瞻、后顾和原子分组

我在我的正则表达式中找到了这些东西,但我不知道可以用它们来做什么。

有人有例子可以让我尝试理解它们是如何工作的吗?

(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind (?>) - atomic group

admin 更改状态以发布 2023年5月24日
0
0 Comments

回顾是零宽断言。它们检查当前位置左侧或右侧的正则表达式是否匹配(基于之前或之后),当找到匹配时成功或失败(基于是正面还是反面),并且丢弃匹配的部分。它们不消耗任何字符——它们后面(如果有的话)的正则表达式的匹配将从同一光标位置开始。

请阅读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等)要求回顾后面的部分具有固定的长度。

  • 原子组基本上会在令牌匹配后舍弃/忘记组中的后续令牌。查看此页面以获取有关原子组的示例原子组
0
0 Comments

示例

给定字符串 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 将:

    1. 匹配它的第一个备选项 foo,然后由于在 foots 中没有紧随其后,将失败并回溯到其第二个备选项;
    2. 匹配它的第二个备选项 foot,然后由于 s 立即紧跟在 foots 中,将成功并停止。

一些资源

在线测试工具

0