我发现这些东西在我的正则体,但我没有一个线索,我可以使用它们。 谁能举个例子,让我试着理解它们是如何工作的?

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

(?>) - atomic group

当前回答

格洛金迅速地环顾四周。 如何区分前瞻和后瞻? 和我一起游览2分钟:

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

假设

    A  B  C #in a line

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

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

我们可以看到,前面和后面在两个解中是相反的。 正则表达式是解决方案二。

其他回答

为什么?假设你在玩wordle游戏,你输入了“ant”。(是的,三个字母的单词,这只是一个例子-冷静)

答案返回为空白,黄色,绿色,并且您有一个三字母单词的列表,您希望使用正则表达式来搜索?你会怎么做?

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

[a-z]{2}t

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

[b-z]{2}t

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

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

或者把它分解;

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

[b-z]{2} -前两个位置除“a”外的两个字母;

T,字面上的T在第三个位置

我曾经回头寻找模式,并向前看,以寻找表丢失与(nolock)

expression="(?<=DB\.dbo\.)\w+\s+\w+\s+(?!with\(nolock\))"

matches=re.findall(expression,sql)
for match in matches:
    print(match)

例子

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

前瞻消极(?!)

找到表达式A,其中表达式B不跟在后面:

A(?!B)

正面看后面(?<=)

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

(?<=B)A

看负(?<!)

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

(?<!B)A

原子团(?>)

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

(?>foo|foot)应用于foots的s将匹配它的第一个替代foo,然后失败,因为s没有立即跟随,并在回溯被禁用时停止

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

(foo|foot)应用于foots将: 匹配它的第一个替代foo,然后失败,因为s没有立即跟随在foots中,并返回到它的第二个替代; 匹配它的第二个备选脚,然后成功,因为s紧随其后,并停止。

一些资源

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

在线测试人员

https://regex101.com

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

更多细节请阅读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确保字符串匹配其他一些规则。如果没有前瞻,它将匹配长度为3或5的字符串。

消极的超前

语法:

(?!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等)都要求后面的查看部分有固定的长度。

一旦一个令牌匹配,原子组基本上会丢弃/忘记组中的后续令牌。查看本页以获得原子组的示例

格洛金迅速地环顾四周。 如何区分前瞻和后瞻? 和我一起游览2分钟:

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

假设

    A  B  C #in a line

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

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

我们可以看到,前面和后面在两个解中是相反的。 正则表达式是解决方案二。