我在正则表达式主体中找到了这些东西,但是我不知道如何使用它们。有人有例子吗,所以我可以尝试了解它们是如何工作的?
(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group
我在正则表达式主体中找到了这些东西,但是我不知道如何使用它们。有人有例子吗,所以我可以尝试了解它们是如何工作的?
(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group
Answers:
给定字符串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 finds the 2nd bar ("bar" which does not have "foo" before it)
您也可以将它们结合起来:
(?<=foo)bar(?=bar) finds the 1st bar ("bar" with "foo" before it and "bar" after it)
(?=)
在表达式B后面找到表达式A:
A(?=B)
(?!)
查找表达式B不遵循的表达式A:
A(?!B)
(?<=)
查找表达式B前面的表达式A:
(?<=B)A
(?<!)
查找表达式A不在表达式B之前的表达式:
(?<!B)A
(?>)
原子组退出组并在组内的第一个匹配模式之后丢弃其他模式(禁用回溯)。
(?>foo|foot)s
应用于foots
将会匹配其第一个替代方法foo
,然后失败,因为s
不会立即跟进,然后由于禁用回溯而停止非原子团将允许回溯;如果后续的后续匹配失败,它将回溯并使用其他模式,直到找到整个表达式的匹配项或所有可能性已用尽。
(foo|foot)s
适用于foots
:
foo
,然后由于s
未立即跟随而失败foots
,并回溯至其第二个替代方案;foot
,然后s
立即在中成功,然后foots
停止。环顾四周是零宽度的断言。他们检查正则表达式(基于当前位置的前后方向)(在当前位置的右边或左边),找到匹配项时成功或失败(基于正或负),并丢弃匹配的部分。它们不占用任何字符-紧随其后的正则表达式的匹配项(如果有)将从相同的光标位置开始。
有关更多详细信息,请阅读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等)都要求后视部分具有固定的长度。
(?=REGEX_1)REGEX_2
只会在之后REGEX_2
出现时匹配吗? REGEX_1