2016-07-04 98 views
2

我試圖創建一個正則表達式模式來匹配一個特定的字符串,並返回true如果字符串匹配的模式和false如果不是。這裏的條件是:Java正則表達式

  1. 必須與[開始和]
  2. 結束的每個項目內的支架必須用逗號隔開
  3. 用逗號隔開的每個項目都遵循這個正則表達式: ^[A-Za-z][A-Za-z0-9_]*$

如何讓一個正則表達式檢查所有這些條件?

+0

任何地方都不允許有空格? – markspace

回答

2

在Java中,\w沒有Pattern.UNICODE_CHARACTER_CLASS標誌實際上與[a-zA-Z0-9_]相同。所以,我會用

String pat = "\\[[a-zA-Z]\\w*(?:,[a-zA-Z]\\w*)*]"; 

查看IDEONE demo。與String#matches一起使用,或者您必須在開頭添加^(或\\A),並在末尾添加$(或\\z)。

String pat = "\\[[a-zA-Z]\\w*(?:,[a-zA-Z]\\w*)*]"; 
System.out.println("[c1,T4,yu5]".matches(pat)); // TRUE 

模式解釋

  • \\[ - 字面[
  • [a-zA-Z] - 英文字母(同\\p{Alpha}
  • \\w* - 從[a-zA-Z0-9_]零個或多個字符集
  • (?: - 非捕獲組匹配的開始...
    • , - 逗號
    • [a-zA-Z]\\w* - 見上文
  • )* - ...零次或多次
  • ] - 一個字面意思](不需要在字面類以外的字面上轉義)。
+0

所以這與Zbynek的本質是相同的正則表達式,除了你用'\\ w'替換了'[a-zA-Z0-9_]'? –

+1

如果是這樣,那麼兩者都適合我。謝謝你的答案。 –

3

封閉組中可能重複:

\[[A-Za-z][A-Za-z0-9_]*(?:,[A-Za-z][A-Za-z0-9_])*\] 

這是應該出現在最終的字符串。根據特定語言逃脫特價商品。

+5

正則表達式使下半部分重複(減少回溯)更好,並且不需要捕獲任何東西,所以:'[[A-Za-z] [A-Za-z0-9 _] *(? :,[A-Za-z] [A-Za-z0-9 _] *)* \]' – Andreas

+0

是的。謝謝! –