2014-09-05 53 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$/