2013-04-09 32 views
0

我在JavaScript以下正則表達式匹配類似於book[n]book[1,2,3,4,5,...,n]book[author="Kristian"]book[id=n](n是任意數):的Javascript正則表達式,確定哪些組上匹配

var opRegex = /\[[0-9]+\]|\[[0-9]+,.*\]|\[[a-zA-Z]+="*.+"*\]/gi; 

我可以在使用此通過以下方式:

// If there is no match in any of the groups hasOp will be null 
hasOp = opRegex.exec('books[0]'); 

/* 
Result: ["[0]", index: 5, input: "books[0]"] 
*/ 

如上圖所示我不僅得到了價值,而且在[和]。我可以通過使用組來避免這種情況。所以我改變了正則表達式:

var opRegex = /\[([0-9]+)\]|\[([0-9]+,.*)\]|\[([a-zA-Z]+=".+")\]/gi; 

運行一樣的結果上面將改爲:

["[0]", "0", undefined, undefined, index: 5, input: "books[0]"] 

在上面,我得到了集團作爲數組索引1,2和3。對於這個例子,匹配是在第一個,但如果匹配在第二個正則表達式組中,匹配將在索引2或數組中。

我可以更改我的第一個正則表達式來獲取沒有括號的值嗎?還是使用分組方法和while循環來獲取第一個定義的值?

還有什麼我失蹤了?它是否貪婪?

讓我知道你是否需要更多的信息,我很樂意提供。

回答

2

我有幾點建議。首先,特別是因爲您正在尋找字面括號,所以請儘量避免使用正則表達式(例如,將[0-9]替換爲\d)。此外,您允許使用*多個引號,因此我將其更改爲"?。但最重要的是,我在替換之外移動了方括號的比賽,因爲它們應該在每次替補比賽中進行。這樣,無論哪個部分匹配,您都有相同的組。

/\[(\d+(,\d+)*|[a-zA-Z]+="?[^\]]+"?)\]/gi 
+0

很好用!你能否解釋一下「輪換之外......每場替補賽」。我沒有完全明白。 – Asken 2013-04-09 19:11:39

+0

基本上,您需要分組外的括號(parens),因此它們不是匹配組的組成部分。你在第二個正則表達式中這樣做了,但是你有三個獨立的分組,而不是一個主分組。在解決方案中,只有一組parens,所以只有一組。 – 2013-04-09 19:23:39