2012-12-06 92 views
1

最後,我需要一個正則表達式,它基本上將我的電話號碼轉換爲符合E164的數字。至於現在我得到了這個:替換大括號內的所有內容?

result = s.replaceAll("[(*)|+| ]", ""); 

它取代了一切罰款:空格,「+」 - 符號,還括號「()」。但它不符合它的大括號的內容,例如號碼+49 (0)11 111 11 11將被替換爲49111111111

我該如何得到這個工作?

+0

爲什麼不把一切都不是數字? – millimoose

+0

使用空字符串替換所有'(\(\ d + \)| \ D)'這個簡單的東西可以用於你的例子。 – Alex

回答

4

你可以做到這一點,但是如果圓括號之間不僅僅是零,會怎樣呢?

result = s.replaceAll("\\([^()]*\\)|[*+ ]+", ""); 

作爲一個詳細的正則表達式:

result = s.replaceAll(
    "(?x)  # Allow comments in the regex.      \n" + 
    "\\(  # Either match a (        \n" + 
    "[^()]* # then any number of characters except parentheses \n" + 
    "\\)  # then a).          \n" + 
    "|  # Or            \n" + 
    "[*+\\ ]+ # Match one or more asterisks, pluses or spaces", ""); 
+0

但'0' *是一個數字! – ruakh

+0

仍然不會刪除'0' –

+0

他不希望括號內的0。 – Alex

3
[(*)|+| ] 

是一個字符類,匹配任何單個圓括號,星號棒,加或空格字符。擺脫了方括號,並使用類似

s.replaceAll("\\(.*?\\)|\\D", ""); 

這將刪除其他任何東西,不是一個數字之間的任何東西(包括)括號,以及。請注意,這將不處理嵌套的括號非常好 - 它會吃一切從一個開括號的第一關閉一個它認爲,這樣會改變(123(45)67)67(要刪除的不平衡右括號,因爲它是一個\D

0

我認爲你從character classes預計會有太多的魔法。首先,在字符類中,不要使用|。這只是另一個角色,將與角色類相匹配。只需列出您希望包含的所有字符,而無需使用任何分隔符。

其次,角色類真的只是匹配單個字符。所以(*)裏面的一個字符類可以根據定義除了刪除(*(字面上)或)。如果你是100%肯定,你的投入將永遠不會有嵌套括號或括號不匹配或東西,那麼你可以做這樣的事情:

"(?:\\([^)]\\)|\\D)+" 
+0

你需要加倍反斜槓。 –

+0

@TimPietzcker好抓,thx –

0

你可以試試這個:"(\\(\\d+\\))|\\+|\\s"。刪除paren和內容,加號和空格。

相關問題