2012-04-12 206 views
2

我想弄清楚如何編寫一個正則表達式來匹配包含任意數量的非括號字符的4組括號。Java正則表達式:與多組括號匹配一個字符串

例如,這些應該匹配。

[hello][world][foo][bar] 
[][][][] 

但這些不應該:

[a][b][c] 
[a][b][c][d]e 
[[a]][b][c][d] 

如果我沒有記錯的話,這個(下)似乎匹配括號的一組和中的人物。

\\[[^\\[\\]]*\\] 

我認爲我可以通過執行以下操作將它擴展到4組,但它不起作用。

[\\[[^\\[\\]]*\\]]{4} 

我在這裏錯過了什麼?預先感謝您的幫助。我很感激。

回答

9

試試這個:

Pattern p = Pattern.compile("^(\\[[^\\[\\]]*\\]){4}$"); 

要打破下來你:

"^(\\[[^\\[\\]]*\\]){4}$" 
││├─┘├───────┘│├─┘ │ └─ the end of the line. 
│││ │  ││ └─ repeat the capturing group four times. 
│││ │  │└─ a literal "]" 
│││ │  └─ the previous character class zero or more times. 
│││ └─ a character class containing anything but the literals "[" and "]" 
││└─ a literal "[". 
│└─ start a capturing group. 
└─ the beginning of the string. 
+0

感謝您的詳細回覆。當我使用方括號或括號時,我很困惑。 「[^ \\\ [\\\]] *」=零個或多個非括號字符,但「(abc){4}」= abc四次。什麼時候應該與其他人一起使用? – Dazarath 2012-04-12 21:47:28

+0

@Dazarath:重複/量詞運算符('?','+','*','{n,m}')作用於前一個*標記*,並捕獲組「(...)」和字符類'''兩者恰好是令牌。事實上,使用捕獲組(或非*捕獲組(*:...)')通常是因爲它在一個序列中創建了一個記號。所以,如果你想匹配單詞「foo」任意多次,你不能說'foo *'因爲前一個記號是'o',所以你需要說'(foo)*'。 – maerics 2012-04-12 21:58:04

4

你需要組要重複塊,否則只會匹配的東西,重複最後一個] 4次:

(\\[[^\\[\\]]*\\]){4} 

正如詹姆斯低於所指出的,它看起來像你試圖使用[]進行分組,而不是()。這可能是你的錯誤出現的地方。

+1

實際上,你需要刪除這些額外的外支架。 – 2012-04-12 21:29:08

+0

哎呀,複製/粘貼失敗。固定。 – VeeArr 2012-04-12 21:30:50