2014-09-05 55 views
0

在JS,如果我有一个像正则表达式:从.match更改捕获组顺序()

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

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

另外请记住,我想在开始时仍然捕获(.*?),所以只是简单地移除那些parens不会帮助我。

+2

您是否使用那些其他捕获组?或者我们可以让他们成为非捕获组? ('0-9] {1,4})$ {^}(){[0-9] {1,4})是“肮脏”的解决方案,年$“更清晰的解决方案是将上述内容分解为两个正则表达式调用。 – abc123 2014-09-05 01:13:12

回答

2

全年绝不会在matches[1]。捕获组编号是基于整个正则表达式分配的,而不是通过哪种替代匹配。如果其中一个选项不匹配,则其所有捕获组都将为空。

因此,如果第一个选择匹配,年份将在matches[2]。如果第二种方案匹配,它将在matches[3]。然后,您可以得到一年从哪个再配上:

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

顺便说一句,有没有必要使用new RegExp当正则表达式是一个字符串。使用RegExp文字

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