理解javascript中正则表达式背后的积极外观

理解javascript中正则表达式背后的积极外观,javascript,regex,Javascript,Regex,嘿,伙计们,我刚刚在SO上读到这个问题,遇到了以下正则表达式: (?<=:)(.*?)(?=\/|$) 它基本上意味着一个非捕获组,但是现在,只有当正查找组中的内容匹配时,才匹配(?正查找组。 您是对的,在大多数情况下,使用非捕获组的行为都是一样的 但有一点不同: 将捕获foobar 将仅捕获条(如果前面是foo) 正查找仅当正查找组中的内容匹配时才会匹配。 您是对的,在大多数情况下,使用非捕获组的行为都是一样的 但有一点不同: 将捕获foobar 将仅捕获条(如果前面是foo) J

嘿,伙计们,我刚刚在SO上读到这个问题,遇到了以下正则表达式:

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

它基本上意味着一个非捕获组,但是现在,只有当
正查找组中的内容匹配时,才匹配(?
正查找组。
您是对的,在大多数情况下,使用
非捕获组
的行为都是一样的

但有一点不同:

  • 将捕获
    foobar
  • 将仅捕获
    (如果前面是
    foo

正查找
仅当
正查找
组中的内容匹配时才会匹配。 您是对的,在大多数情况下,使用
非捕获组
的行为都是一样的

但有一点不同:

  • 将捕获
    foobar
  • 将仅捕获
    (如果前面是
    foo

    • Javascript不支持查找


      基本上,lookbehind用于验证某些内容是否可以匹配,但不会添加到最终结果中。因此,例如,如果您想要匹配abc,但只需要abc,并且您的正则表达式风格支持lookarounds,那么您可以编写如下内容:
      (?Javascript不支持lookbehind)


      基本上,lookbehind用于验证某些内容是否可以匹配,但它不会被添加到最终结果中。因此,例如,如果您想要匹配abc,用数字包围,但您只需要abc,并且您的regex风格支持lookarounds,您可以编写如下内容:
      (?更新:第一件事。Javascript不支持lookbehind。

      [2018年4月23日]现在Javascript支持lookbehind。请参阅提案

      外观落后的解释

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

      那你是做什么的?

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

      这有点类似于

      您当前处于要匹配的文本的某个位置(这类似于朝前方向),您希望看到后面的内容

      Lookbehind为零宽度意味着它不会使用任何类似于的字符串。您希望在不改变位置的情况下查看后面的内容


      因此,使用regex
      (?更新:第一件事。Javascript不支持lookbehind。

      [2018年4月23日]现在Javascript支持lookbehind。请参阅提案

      外观落后的解释

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

      那你是做什么的?

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

      这有点类似于

      您当前处于要匹配的文本的某个位置(这类似于朝前方向),您希望看到后面的内容

      Lookbehind为零宽度意味着它不会使用任何类似于的字符串。您希望在不改变位置的情况下查看后面的内容


      所以使用regex
      (?在Javascript中不支持Look behinds!有。在Javascript中不支持Look behinds!有。我喜欢这个类比(+1):)您可能想补充一点,与lookaheads相反,大多数正则表达式风格不支持无限宽lookbehinds。@rock321987很好,现在我有点理解了积极lookbehinds的重要性。所以PHP确实支持积极lookbehinds,但JS不支持。我喜欢这个类比(+1):)您可能想补充一点,与lookaheads相反,大多数正则表达式并不支持无限宽lookbehinds。@rock321987很好地感谢现在我有点理解了积极lookbehinds的重要性。所以PHP确实支持积极lookbehinds,但JS不支持。顺便说一句:大多数正则表达式支持固定宽度lookbehinds,而只有极少数支持infinte-width-lookbehinds(.net-does)。因此
      (?Oops,抱歉。我的不好。正如旁注:大多数正则表达式风格支持固定宽度的lookbehinds,而只有极少数支持infinte-width-lookbehinds(.net-does)。因此
      (?Oops,抱歉。我的不好。
      
      (?:car)
      
      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.