从.match()更改捕获组顺序

时间:2014-09-05 01:11:15

标签: javascript regex match wildcard capture

在JS中,如果我有一个Regexp:

new RegExp('^(.*?) in the year ([0-9]{1,4})$|^([0-9]{1,4}) is the year$')

那么我如何确保“年份”部分始终是同一个捕获组,以便我可以像matches[2]那样访问它?目前,如果RegExp的第一部分匹配,则年份为matches[2],但在第二部分为matches[1]。我想改为使它们相同,这样我就可以不断检索相同的值。

另外请记住,我还想在开始时抓住(.*?),所以简单地删除那里的parens对我没用。

1 个答案:

答案 0 :(得分:2)

这一年永远不会在matches[1]。捕获组编号是根据整个正则表达式分配的,而不是基于哪个替代匹配。如果其中一个替代方案不匹配,则其所有捕获组都将为空。

因此,如果第一个选项匹配,则年份将在matches[2]。如果第二个选项匹配,则它将在matches[3]中。然后,您可以从以下任何一个获得年份:

var year = matches[2] || matches[3];

BTW,当正则表达式是文字字符串时,不需要使用new RegExp。使用RegExp文字

/^(.*?) in the year ([0-9]{1,4})$|^([0-9]{1,4}) is the year$/