【问题标题】:Get capture groups from a conditional REGEX从条件 REGEX 获取捕获组
【发布时间】:2011-11-30 20:54:08
【问题描述】:

我想编写一个匹配 2 个模式中的 1 个的条件正则表达式。

为此,我有一个简单的条件:

/((pattern1)|(pattern2))/gi

问题是,在模式 1 中,我可能有多个捕获组 - 假设其中 3 个,但在模式 2 中,我有 5 个。

我如何知道匹配的 2 个模式中的哪一个?我需要能够为我的输出请求正确的捕获组(按数量)。

我想在我的示例中,您可以检查是否存在任何大于 3 的捕获组值,但假设我在每个模式中都有相同数量的捕获组。我认为必须有一个好方法来做到这一点——我正在使用 PHP 或 JavaScript。如果需要更多详细信息,请告诉我。

提前致谢!

【问题讨论】:

  • 为什么不只使用两个正则表达式 =D
  • 这不是条件,而是交替。

标签: php javascript regex


【解决方案1】:

模式根据正则表达式本身进行编号,而不是根据实际匹配的结果。在您的示例中,整个组将始终是组 1,然后第一个可能性(“模式 1”)将是组 2,另一个将是组 3。如果“模式 2”匹配,那么组 3 将是非空的并且换句话说,第 2 组将是空的。第 1 组将始终与第 2 组和第 3 组中的非空组相同。

【讨论】:

  • 啊,所以您是说理论上,pattern1 将始终包含捕获组 2、3 和 4,而 pattern2 将始终包含组 5、6 和 7,这取决于我的编写方式正则表达式??
  • 是的。我一直做的是按正则表达式中左括号的位置计算组。 (我不是 100% 确定这完全正确,但我不会写太多超级复杂的正则表达式。)所以最左边的“(”是第 1 组,然后下一个“(”是第 2 组,等等。
  • 是的,这就是规则:左括号的相对位置决定了组号。但是,可以在某些情况下覆盖该行为,例如 sln 使用的分支重置组。
【解决方案2】:

(pattern1) 将在 match[1] 中如果匹配,match[1] 将在 undefined 如果它不匹配。(pattern2) 将在 match[2] 如果存在,@987654324 @如果不是。

匹配数组是从正则表达式本身定义的,而不考虑实际匹配的内容。那些没有被匹配到的东西将在数组中未定义。

在这段代码中:

var re = /(patt)(ern1)|(pat)(tern2)/i;
var str = "this is pattern1 and some more text";

var matches = str.match(re);

您会得到一个包含五个条目的匹配数组。

matches[0] === "pattern1"
matches[1] === "patt"
matches[2] === "ern1"
matches[3] === undefined
matches[4] === undefined
matches.length === 5

请注意,这仅在您删除外部捕获括号和匹配模式中的“g”标志时才有效。

【讨论】:

    【解决方案3】:

    我建议您通过这种方式在 Firefox 中的 firebug 等控制台中尝试您想要找到的内容:

    'mystring'.replace(/myregex/gi, function () {
        console.info(arguments);
    });
    

    像这样你可以做一些试验和错误来看看正则表达式是如何工作的。但请注意:RegExp 并非在每种情况下都适用于相同的跨浏览器。

    【讨论】:

      【解决方案4】:

      我如何知道匹配的 2 个模式中的哪一个?我需要能够为我的输出请求正确的捕获组(按数量)。”

      如果您对每个模式中的分组一无所知

      (?|(pattern1)|(pattern2))

      允许您从第 1 组开始索引。
      但哪种模式的重要性可能仍然是个谜。在那之后最好检查内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-12-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-17
        • 2015-06-07
        • 2021-03-10
        相关资源
        最近更新 更多