嘿伙计们我刚刚在SO HERE 上阅读了这个问题,并且遇到了以下正则表达式:
(?<=:)(.*?)(?=\/|$)
现在我想知道这段正则表达式到底在做什么(?<=:)
?有人可以解释一下吗?
如果我在regex101.com上查看正则表达式,我会得到以下内容:
(?&lt; = :)正面观察 - 断言下面的正则表达式可以 匹配:匹配字符:字面意思。
现在我正在学习正则表达式,我明白如果我有以下内容:
(?:car)
它基本上意味着一个非捕获组,但现在(?&lt; = :)的含义是什么?有人可以用什么方式解释这有用吗?
答案 0 :(得分:3)
更新:首先是第一件事。 Javascript不支持Lookbehinds。
[2018年4月23日] Javascript现在支持Lookbehinds。请参阅提案here
。
lookbehinds的解释
我将用一个类比来解释这一点。假设你站在面向前方的某个地方。现在你想看看你背后的东西。
那你做什么?
你向后移动整个身体180度> 而不改变你的位置 并观察那里有什么。
这是有些类似于。
的后视您目前处于匹配文本的某个位置(这就像面向前方),您希望看到背后的内容。
Lookbehind是零宽度意味着它不会消耗任何与类似的字符串,您希望在不改变位置的情况下看到背后的内容
因此,使用正则表达式(?<=:)abc
,您基本上是在abc
之前找到:
所有位置abc
。
记得:
刚刚检查过,因为zero-width
的{{1}}断言属性而没有存储在任何地方
注意强>
这只是一个松散耦合的类比,可以更好地理解和可视化。实际上,在每个位置都会向后检查look(aheads|behinds)
的存在,就像字符串:
一样(下面的空格是为了清晰)
ab:abc
注1
大多数编程语言的正则表达式库不支持变量/ infinte宽度lookbehind,除了很少像a b : a b c
^
When this is the position of checking, a is matched with :
a b : a b c
^
When this is the position of checking, b is matched with :
a b : a b c
^
When this is the position of checking, : is matched with :
As they match, now abc of regex is matched against string abc.
If successful match is found.
,.NET
python库等。所以使用regex
等将给出一个错误。
答案 1 :(得分:1)
Positive lookbehind
组内的内容匹配时, positive lookbehind
才会匹配。
你是对的,在大多数情况下,使用non capturing group
的行为都是一样的。
但是有区别:
/(?:foo)bar/
将捕获foobar
/(?<=foo)bar/
只会捕获bar
(如果先于foo
)答案 2 :(得分:1)
Javascript不支持Lookbehind。
基本上,lookbehind用于验证某些东西是否可以匹配 - 但它不会被添加到最终结果中。所以,例如,如果你想匹配数字包围的abc,但你只想要abc,并且你的正则表达式支持外观,你可以编写类似于:(?<=[0-9])(abc)(?=[0-9])
的内容。这意味着:“我想要abc,但只有在它跟随并在数字之前。”
在您的问题示例中,它表示:“匹配:
和/
之间的所有内容”