理解JavaScript中正则表达式背后的积极含义

Understanding positive look behind regex in JavaScript

本文关键字:背后 JavaScript 正则表达式 理解      更新时间:2023-09-26

我刚刚读到这个堆栈溢出问题,遇到了以下正则表达式:

(?<=:)(.*?)(?='/|$)

我想知道这段regex到底在做什么(?<=:)

如果我在regex101.com上检查regex,我会得到以下信息:

(?<=:(Positive Lookbacking-断言下面的正则表达式可以是match:匹配字符:字面意思。

现在我只是在学习regexs,我明白如果我有以下内容:

(?:car)

它基本上意味着一个非捕获组,但现在(?<=:(是什么意思?这在什么方面有用?

更新:第一件事Lookbehinds在Javascript中不受支持

[2018年4月23日]Lookbehinds现在在Javascript中得到支持。请参阅提案here

lookbehinds的解释

我将用一个比喻来解释这一点。假设你站在某个面向前方的地方。现在你想看看你身后是什么。

那你是怎么做的

在不改变位置的情况下向后移动头部(可能是整个身体180度(,观察那里有什么。

这是有点类似于.的后备

您当前处于匹配的文本的某个位置(这就像面朝前(,您想看看后面是什么。

Lookbehing是零宽度,这意味着它不消耗任何类似于的字符串。您希望在不更改位置的情况下查看后面的内容

因此,使用正则表达式(?<=:)abc,您基本上是在尝试查找abc的所有位置,其中abc之前有一个:

请记住,由于look(aheads|behinds)zero-width断言属性,:只是被检查过并且没有存储在任何位置

注意

这只是一个松散耦合的类比,以便更好地理解和可视化。事实上,在每个位置,都会向后检查:的存在,就像字符串ab:abc一样(下面的空格是为了清楚(

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.

注1

大多数编程语言的regex库都不支持可变/中项宽度的lookbacking,只有少数像python的.NETregex库等。因此,使用(?<=:*)等会出现错误。

Positive lookbehind只有在positive lookbehind组内的内容匹配时才会匹配。您是对的,在大多数情况下,使用non capturing group的行为都是一样的。

但有一个区别:

  • /(?:foo)bar/将捕获foobar
  • /(?<=foo)bar/将仅捕获bar(如果前面是foo(

在Javascript中不支持Lookbacking。

基本上,lookbacking用于验证某个东西是否可以匹配,但它不会添加到最终结果中。因此,例如,如果你想匹配abc,用数字包围,但你只想要abc,并且你的regex风格支持查找,你可以写这样的东西:(?<=[0-9])(abc)(?=[0-9])。这意味着:"我想要abc,但只有当它在数字后面和前面时。">

在您问题中的示例中,它的意思是:"匹配:/之间的所有内容">