从条件REGEX获取捕获组

时间:2011-11-30 20:54:09

标签: php javascript regex

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

要做到这一点,我有一个简单的条件:

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

问题是,在pattern1中,我可能有多个捕获组 - 比如说3个,但在pattern2中,我有5个。

如何判断两种模式的匹配情况?我需要能够为我的输出请求正确的捕获组(按编号)。

我想在我的例子中你可以检查是否存在任何超过3的捕获组值,但是说我在每个模式中都有相同数量的捕获组。我认为必须有一个很好的方法来做到这一点 - 我使用的是PHP或JavaScript。如果需要更多细节,请告诉我。

提前致谢!

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

(pattern1)如果匹配则匹配[1],匹配[1]如果匹配则为undefined(pattern2)将匹配[2]如果存在,undefined如果不存在。

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

在此代码中:

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”标记。

答案 2 :(得分:0)

我建议用这种方式尝试在Firefox中的firebug等控制台中找到你想要的东西:

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

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

答案 3 :(得分:0)

如何判断两种模式的匹配情况?我需要能够为我的输出请求正确的捕获组(按编号)。”

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

(?|(pattern1)|(pattern2))

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