【问题标题】:capturing group in regex [duplicate]在正则表达式中捕获组[重复]
【发布时间】:2011-09-19 03:00:31
【问题描述】:

我正在探索在 Regex 中捕获组,但我对缺少文档感到困惑。例如,谁能告诉我两个正则表达式之间的区别:

/(?:madhur)?/

/(madhur)?/

在我看来,? in second 建议在字符串中匹配madhur 零或一次。

第一个和第二个有什么不同?

【问题讨论】:

    标签: javascript regex


    【解决方案1】:

    第一个不会存储捕获组,例如$1 将为空。 ?: 前缀使其成为非捕获组。这样做通常是为了获得更好的性能和避免反向引用的混乱。

    在第二个示例中,捕获组中的字符将存储在反向引用$1中。

    Further Reading.

    【讨论】:

    • 为什么要使用非捕获分组?就像在那种情况下括号不是多余的吗?换句话说,/(?:madhur)?/ 和 /madhur?/ 之间有什么不同
    • 原因是将条件应用于整个文本。不,这两个不一样。第一个是 madhur 是可选的,第二个只有 r 是可选的。
    • @alex...为什么在匹配或拆分中使用捕获组会导致不同的结果。例如:" , ".match(/(\s+)?,(\s+)?/) 产生 [","," "," "],而 " , ".match(/(\s+)?,(\s+)?/g)" , ".match(/[\s+]?,[\s+]?/) 产生 [","]。你能解释一下为什么
    • @MuhammadUmer 添加g 会更改与match() 匹配的返回方式(如果您有捕获组)。
    【解决方案2】:

    完全不影响匹配。

    它告诉正则表达式引擎

    • 不存储组内容以供replace() 方法使用(如$1、$2、...)
    • 不要在exec()方法的返回数组中返回,并且
    • 不要将其算作反向引用(\1、\2 等)

    【讨论】:

    • 一个小问题:它在某些情况下会改变匹配。例如。在/(foo)\1/ 将匹配"foofoo",但/(?:foo)\1/ 不会。 \1 在第一个中被解释为反向引用,在第二个中被解释为八进制转义序列。
    • 为什么这两个不同" , ".match(/(\s+)?,(\s+)?/)" , ".match(/[\s+]?,[\s+]?/)它们输出不同的数组。
    • 一个使用一个表示“一个或多个空格或根本没有”的组,另一个使用一个表示“一个空格或一个加号或根本没有”的字符类。
    【解决方案3】:

    这是最明显的例子:

    "madhur".replace(/(madhur)?/, "$1 ahuja");   // returns "madhur ahuja"
    "madhur".replace(/(?:madhur)?/, "$1 ahuja"); // returns "$1 ahuja"
    

    反向引用按顺序存储,以便可以使用$1 调用第一个匹配项,使用$2 调用第二个匹配项等。如果您捕获匹配项(即(...) 而不是(?:...)),您可以使用这些,如果你不这样做,那就没什么特别的了。作为另一个示例,请考虑以下内容:

    /(mad)hur/.exec("madhur");   // returns an array ["madhur", "mad"]
    /(?:mad)hur/.exec("madhur"); // returns an array ["madhur"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-13
      • 2011-03-11
      • 2017-01-07
      • 2019-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多