2011-11-30 100 views
2

我想写一个条件正则表达式,匹配2个模式中的1个。从条件REGEX获取捕获组

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

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

问题是,模式1中,我可以拥有多个采集组 - 可以说,他们的3,而模式2中,我有5个其中。

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

我想我的例子中,你可以检查任何捕获组值超过3的存在,但说我有每个模式中等量的捕获组。我在想一定有一种很好的方式来做到这一点 - 我使用PHP或JavaScript。让我知道是否需要更多细节。

在此先感谢!

+1

为什么不只是使用两个正则表达式= D – Esailija

+0

这不是一个有条件的,而是一个交替。 –

回答

3

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

+0

啊,所以你在说理论上,pattern1总是包含捕获组2,3和4,而pattern2将总是包含5,6和7组,只是基于我如何编写正则表达式? – tresstylez

+0

是的。我一直在做的是通过正则表达式左侧paren的位置来计算组。 (我不是100%肯定这是严格正确的,但我不写太多超复杂的正则表达式。)因此,最左边的“(”是组1,然后是下一个“(”是组2, – Pointy

+0

是的,这是规则:开放paren的相对位置决定了组号,但是可以在某些口味中覆盖该行为,例如使用[sln]分支重置组http://stackoverflow.com/a/8333398/20938)使用。 –

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 

注意,这只适用于如果你删除外部捕获parens和你的匹配模式中的“g”标志。

0

我想推荐出你想在Firefox中像萤火控制台找到这样的内容:

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

这样你就可以做一些试验和错误,看看正则表达式的作品。但要注意的是:RegExp在各种情况下都不能使用相同的跨浏览器。

0

我怎么能告诉WHICH的两个模式匹配?我需要能够为我的输出请求正确的捕获组(按编号)。”

如果你不知道的任何分组中的每个图案

(?|(pattern1)|(pattern2))

可以让你在第1组开始索引。
但是,哪种模式的意义可能仍然是一个谜。在那之后更好地检查内容。