Regex向前看 向后看和原子团

我发现这些东西在我的正则表达式体,但我没有得到一个线索,我可以使用它们。

我发现这些东西在我的正则表达式体,但我没有得到一个线索,我可以使用它们。

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

示例

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

Definitions

向前看积极(?=)

找到表达式 A,其中表达式 B 如下:

A(?=B)

前瞻负(?!)

在表达式 B 不跟随的地方找到表达式 A:

A(?!B)

看后面正(?<=)

在表达式 B 之前找到表达式 A:

(?<=B)A

看后面的负(?<!)

查找表达式 A,其中表达式 B 不在前面:

(?<!B)A

原子团(?>)

原子组退出一个组,并在组内的first匹配模式之后丢弃替代模式(回溯被禁用)。

应用于foots(?>foo|foot)s将匹配其第一个备选方案foo,然后由于s没有立即跟随而失败,并且由于回溯被禁用而停止

非原子组将允许回溯;如果后续匹配失败,它将回溯并使用替代模式,直到找到整个表达式的匹配项或用尽所有可能性。

(foo|foot)sapplied tofootswill:

匹配其第一个备选方案foo,然后失败,因为s没有立即跟随foots,并回溯到其第二个备选方案;

匹配它的第二个选项foot,然后在foots之后立即成功s,然后停止。

一些资源

http://www.regular-expressions.info/lookaround.html http://www.rexegg.com/regex-lookarounds.html

在线测试人员

https://regex101.com
241

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 是[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_

Look-behind 类似于 Look-ahead:它只是看当前光标位置的后面。像 javascript 这样的一些正则表达式不支持 Look-behind 断言。而大多数支持它的版本 (PHP 、 Python 等) 要求 Look-behind 部分具有固定的长度。

一旦令牌匹配,原子组基本上会丢弃 / 忘记组中的后续令牌。检查此页以获取atomic groups的示例

0

快速摸索环顾四周。
如何区分前视和后视?和我一起游览 2 分钟:

(?=) - positive lookahead
(?<=) - positive lookbehind

假设

    A  B  C #in a line

现在,我们问 B,你在哪里?
B 有两个解决方案来声明它的位置:

一,B 前面有 A,前面有 C
二,B 在 C 的前面(向前),后面(向后看)A。

正如我们所看到的,在两个解决方案中,后面和前面是相反的。
Regex 是解决方案二。

-1

为什么-假设你正在玩 wordle,并且你已经输入了“ant”。(是的,三个字母的单词,它只是一个例子-chill)

答案是空白的,的,绿色的,你有三个字母的单词列表,你希望使用正则表达式来搜索?

要开始,你可以从第三个位置的 t 开始:

[a-z]{2}t

我们可以通过注意到我们没有 a 来改进

[b-z]{2}t

我们可以进一步改进,说搜索必须有一个 n。

(?=.*n)[b-z]{2}t

或将其分解;

(?=。* n)-向前看,并检查匹配中有一个 n,它可能在 n 之前有零个或多个字符

[b-z] {2}-在前两个位置有两个字母而不是 'a';

t-字面意思是“t”在第三个位置

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(232)
如何获得当前月份 (october month number)
上一篇
如何在Windows上使用PowerShell脚本连接和断开蓝牙设备
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(7条)