【问题标题】:What do the question marks like ?: and ?! mean in Javascript regexp? [duplicate]问号像什么?:和?!在 Javascript 正则表达式中是什么意思? [复制]
【发布时间】:2011-12-31 19:34:20
【问题描述】:

喜欢这个正则表达式吗?它匹配什么?

document.getElementById("MyElement").className = 
   document.getElementById("MyElement").className.replace
  ( /(?:^|\s)MyClass(?!\S)/ , '' )

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    ?: 表示将捕获组设为非捕获组,即不将其匹配项作为反向引用。当需要捕获组以使用| 运算符时,通常这样做是为了提高性能并消除反向引用。

    在您的示例中,它被用于允许字符串 ^ 或空格 (\s) 开头的 (|)。由于这段代码的作者并不关心它匹配什么,他们将其设为非捕获组。

    ?! 是负前瞻。仅当捕获组不匹配时,正则表达式才会匹配。

    在本例中,作者希望确保MyClass 之后的字符不是空白字符(\S)。

    这段代码的作者有可能使用了单词边界 (\b)。

    【讨论】:

    • 基本上这个 RE 意味着匹配 word "MyClass" 任何地方,而不是单词的一部分(不匹配 "MyClassExt" 或 "ThisIsMyClass" 等)
    • js regexp 和 perl 或 php 等其他语言中的 regexp 的主要区别是什么,我在 www.w3schools.com 提供的教程中没有找到 ?: 和捕获组的东西。
    • @trunpet:您应该避免将 w3schools 作为资源。它已经过时了,充满了错误和糟糕的建议。
    【解决方案2】:

    正则表达式(?:^|\s) 是一个非捕获组,匹配行首或空白字符。

    正则表达式(?!\S) 是一个否定的先行断言,它要么在字符串末尾成功,要么在下一个字符是空白字符时成功。

    【讨论】:

      猜你喜欢
      • 2015-07-21
      • 2011-05-21
      • 1970-01-01
      • 2014-12-06
      • 2014-07-28
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2014-09-02
      相关资源
      最近更新 更多