2015-05-21 26 views
4

我有一個Java正則表達式:爪哇 - String.replaceAll更換所有字符無法在模式

^[a-zA-Z_][a-zA-Z0-9_]{1,126}$ 

這意味着:

  • 以字母或下劃線字符。
  • 後續字符可能包括字母,數字或下劃線。
  • 長度在1到127個字符之間。

現在,我想用一個下劃線替換一個字符串,該字符串不在那個正則表達式中。

實施例:

final String label = "[email protected]#"; 
System.out.println(label.replaceAll("^[^a-zA-Z_][^a-zA-Z0-9_]{1,126}$", "_")); 

但結果仍是[email protected]#

我該如何「轉換」爲_3_fgh99__

+0

因爲「23_fgh99 @#」以「2」開頭,而不是「[a-zA-Z_]」,所以不匹配。 – Maroun

+0

試試'label.replaceAll(「^ [^ a-zA-Z_] |(?<!^)[^ a-zA-Z0-9_]」,「_」)'。它輸出'_3_fgh99__',但。 –

+0

哎呀,似乎我有一個答案後編輯:)。 –

回答

3

使用​​3210:

final String label = "[email protected]#"; 
System.out.println(label.replaceAll("^[^a-zA-Z_]|(?<!^)[^a-zA-Z0-9_]", "_")); 

它輸出_3_fgh99__

要刪除「不在原始模式」中的內容,您需要取消第一個字符類並僅在開頭檢查一個字符(^[^a-zA-Z_]),然後檢查其他字符而不是開頭的否定第二個字符班級((?<!^)[^a-zA-Z0-9_])。然後,我們只需使用替代符號|即可在1次替換操作中應用這兩種模式。

+0

你說得對。非常感謝。 –

+0

請嘗試向未來的用戶解釋您的答案。 – Maroun

+0

@MarounMaroun:當然,我在大多數情況下解釋我的答案,而且這個案例看起來很奇特。 –