正则表达式lookahead,lookbehind和原子组
我在我的正则表达式中找到了这些东西,但我没有弄清楚我可以使用它们。 有人有例子,所以我可以尝试了解他们如何工作?
(?!) - negative lookahead
(?=) - positive lookahead
(?<=) - positive lookbehind
(?<!) - negative lookbehind
(?>) - atomic group
例子
鉴于字符串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)
定义
向前看正面(?=)
查找表达式A其中表达式B如下:
A(?=B)
展望负面(?!)
查找表达式A表达式B不遵循的地方:
A(?!B)
看后面的正面(?<=)
查找表达式A表达式B在前:
(?<=B)A
看后面的负面(?<!)
查找表达式A表达式B不在先于:
(?<!B)A
原子团(?>)
原子组是一个非捕获组,它退出组并在组内模式的第一次匹配之后抛出所有替代方法,因此禁用回溯。
一个非原子组将允许回溯,它仍然会找到第一个匹配,那么如果提前匹配失败,它会回溯并找到下一个匹配,直到找到整个表达式的匹配或者所有可能性都用尽。
表达式(foo|foot)s
非原子组适用于foots
:
foo
,然后失败,因为s
不紧跟在foots
,并回溯到它的第二选择; foot
,然后成功,因为s
紧跟在foots
,并停止。 应用于foots
的表达式(?>foo|foot)s
原子组将与其第一个备选foo
匹配,然后由于s
不会立即跟随而失败,并且禁用回溯时停止。
一些资源
Lookarounds是零宽度断言。 他们检查正则表达式(向前或向后位置的当前位置的左侧或右侧),如果找到匹配项(基于正值还是负值),则成功或失败,并丢弃匹配的部分。 它们不消耗任何字符 - 跟在它们后面的正则表达式的匹配(如果有的话)将从相同的光标位置开始。
阅读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是[az]{1,2}[0-9]{2,3}
,它匹配一个或两个字母,后跟两个或三个数字。
REGEX_1确保字符串的长度确实是4,但不会消耗任何字符,因此搜索REGEX_2将从相同的位置开始。 现在REGEX_2确保该字符串符合其他一些规则。 如果没有预见,它会匹配三到五个字符串。
句法:
(?!REGEX_1)REGEX_2
仅当REGEX_1不匹配才匹配; 在检查REGEX_1之后,搜索REGEX_2将从相同的位置开始。
例:
(?!.*bFWORDb)w{10,30}$
预见部分检查字符串中的FWORD
,如果发现它,则会失败。 如果它没有找到FWORD
,则FWORD
成功,接下来的部分验证该字符串的长度在10到30之间,并且它只包含单词字符a-zA-Z0-9_
后视与前瞻相似:它只是看在当前光标位置后面。 一些像javascript这样的正则表达式不支持隐藏断言。 支持它的大多数风格(PHP,Python等)都要求后台部分具有固定的长度。
迅速寻找目光。
如何区分lookahead和lookbehind? 和我一起旅行2分钟:
(?=) - positive lookahead
(?<=) - positive lookbehind
假设
A B C #in a line
现在,我们问B,你在哪里?
B有两种解决方案来声明它的位置:
一,B有A,并有C bebind
二,B在C的后面(向后)并在后面(向后看)A.
正如我们所看到的,后面和前面的两个解决方案是相反的。
正则表达式是解决方案二。