我想编写一个匹配2个模式中的1个的条件正则表达式。
要做到这一点,我有一个简单的条件:
/((pattern1)|(pattern2))/gi
问题是,在pattern1中,我可能有多个捕获组 - 比如说3个,但在pattern2中,我有5个。
如何判断两种模式的匹配情况?我需要能够为我的输出请求正确的捕获组(按编号)。
我想在我的例子中你可以检查是否存在任何超过3的捕获组值,但是说我在每个模式中都有相同数量的捕获组。我认为必须有一个很好的方法来做到这一点 - 我使用的是PHP或JavaScript。如果需要更多细节,请告诉我。
提前致谢!
答案 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开始索引。
但这种模式的重要性可能仍然是一个谜。在那之后更好地检查内容。