【问题标题】:understanding positive look behind regex in javascript理解 javascript 中正则表达式背后的积极看法
【发布时间】:2018-04-23 17:21:04
【问题描述】:

大家好,我刚刚在 SO HERE 上阅读了这个问题,并遇到了以下正则表达式:

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

现在我想知道这段正则表达式到底在做什么(?&lt;=:)?有人可以解释一下吗?

如果我检查 regex101.com 上的正则表达式,我会得到以下信息:

(?

现在我只是在学习正则表达式,我明白如果我有以下内容:

(?:car)

它基本上意味着一个非捕获组,但现在 (?

【问题讨论】:

标签: javascript regex


【解决方案1】:

更新:第一件事。 Javascript 不支持 Lookbehinds。

[2018 年 4 月 23 日] Javascript 现在支持 Lookbehinds。见提案here

解释说明

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

那你是做什么的?

你将你的头(可能是整个身体 180 度)向后移动不改变你的位置并观察那里有什么。

有点类似于。

您当前位于要匹配的文本的某个位置(这就像面向前方)并且您想查看后面的内容。

Lookbehind 是零宽度意味着它不会消耗任何类似于 您想在不改变位置的情况下查看后面的内容

的字符串

所以使用正则表达式(?&lt;=:)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

大多数编程语言的正则表达式库不支持可变/无限宽度lookbehind除了少数像.NETregex python库等。所以使用(?&lt;=:*)等会出错。

【讨论】:

  • 我喜欢这个比喻 (+1) :)
  • 您可能想补充一点,大多数正则表达式风格不支持无限宽度的lookbehinds,与lookaheads相反。
  • @rock321987 好吧,谢谢,现在我有点理解正面向后看的重要性.. 所以 PHP 确实支持正面向后看,但 JS 不支持? regex101.com/r/lT8gR3/1.
【解决方案2】:

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

但有区别:

【讨论】:

    【解决方案3】:

    Javascript 不支持 Lookbehind。

    基本上,lookbehind 用于验证是否可以匹配某些内容 - 但它不会添加到最终结果中。因此,例如,如果您想匹配被数字包围的 abc,但您只想要 abc,并且您的正则表达式支持环视,您可以编写如下内容:(?&lt;=[0-9])(abc)(?=[0-9])。这意味着:“我想要 abc,但前提是它在数字之后和之前。”

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

    【讨论】:

    • 附带说明:大多数正则表达式支持固定宽度的lookbehinds,而只有极少数支持无限宽度的lookbehinds(.net 支持)。所以(?&lt;=[0-9]+) 在大多数情况下(PCRE、Java、Boost)都是无效的,而(?&lt;=[0-9]) 就可以了。
    • 糟糕,抱歉。我的错。
    猜你喜欢
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 2017-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多