2013-02-12 19 views
17

我正在編輯從tesseract ocr獲得的一些電子郵件。String.replaceAll()不工作

這裏是我的代碼:

if (email != null) { 
     email = email.replaceAll(" ", ""); 
     email = email.replaceAll("caneer", "career"); 
     email = email.replaceAll("canaer", "career"); 
     email = email.replaceAll("canear", "career"); 
     email = email.replaceAll("caraer", "career"); 
     email = email.replaceAll("carear", "career"); 
     email = email.replace("|", "l"); 
     email = email.replaceAll("}", "j"); 
     email = email.replaceAll("j3b", "job"); 
     email = email.replaceAll("gmaii.com", "gmail.com"); 
     email = email.replaceAll("hotmaii.com", "hotmail.com"); 
     email = email.replaceAll(".c0m", ".com"); 
     email = email.replaceAll(".coin", ".com"); 
     email = email.replaceAll("consuit", "consult"); 
    } 
    return email; 

但輸出是不正確的。

輸入:

[email protected] mai|.com 

輸出:

[email protected]|l.lclolml 

但是當我分配結果到一個新的字符串每次更換後,它工作正常。爲什麼連續賦值在同一個字符串中不起作用?

+0

當我複製/字career的isspellings粘貼在(和修復第5行錯字),它會導致什麼似乎是一個正確的結果 - 「amrut =交流。 [email protected]」。 – Ren 2013-02-12 05:45:36

+3

考慮使用String.replace而不是replaceAll。它完全符合我相信您期望的所有要做的事情。 – Buhb 2013-02-12 06:58:58

+2

因爲看到這樣的代碼,我的眼睛受傷了。 – 2013-02-12 13:28:03

回答

34

您會在Javadoc for String.replaceAll()中注意到第一個參數是regular expression

與句柄(})一樣,句號(.)與管道(|)一樣具有特殊含義。你需要逃避他們,如:

email = email.replaceAll("gmaii\\.com", "gmail.com"); 
+0

我必須逃脫|和{ – Neeraj 2013-02-12 05:50:55

+3

是的。因此「你需要全部逃脫」。 – 2013-02-12 05:52:37

+1

我逃了|由\\ |提供但它仍然沒有被取代。其他一切正常工作 – Neeraj 2013-02-12 06:05:17

5

你必須\\.逃脫.像以下:

if (email != null) { 
    email = email.replaceAll(" ", ""); 
    email = email.replaceAll("caneer", "career"); 
    email = email.replaceAll("canaer", "career"); 
    email = email.replaceAll("canear", "career"); 
    email = email.replaceAll("caraer", "career"); 
    email = email.replaceAll("carear", "career"); 
    email = email.replace("|", "l"); 
    email = email.replaceAll("}", "j"); 
    email = email.replaceAll("j3b", "job"); 
    email = email.replaceAll("gmaii\\.com", "gmail.com"); 
    email = email.replaceAll("hotmaii\\.com", "hotmail.com"); 
    email = email.replaceAll("\\.c0m", "com"); 
    email = email.replaceAll("\\.coin", "com"); 
    email = email.replaceAll("consuit", "consult"); 
} 
return email; 
3

您使用的是一些正則表達式的字符。

他們使用\或使用Pattern.quote方法

4

我認爲你是不知道的replaceAll第一個參數是正則表達式請逃脫。

.,|,}可能會以與您的期望不同的方式進行解釋。

. Any character (may or may not match line terminators) 

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

對於空間您更好地使用

\s A whitespace character: [ \t\n\x0B\f\r] 

和逃避其他特殊字符與一家領先的\\

10

(這是Java的?)

注意,在Java,replaceAll接受一個正則表達式和do t匹配任何字符。你需要躲避點,或使用

somestring.replaceAll(Pattern.quote("gmail.com"), "replacement"); 

還要注意這裏的錯字:

email = emai.replaceAll("canear", "career"); 

應該

email = email.replaceAll("canear", "career"); 
+0

是的,Java。感謝您提及錯字錯誤。我糾正 – Neeraj 2013-02-12 05:58:27

6

通過實現replaceAll()第一個參數是regex你可以讓你的比較更少

例如,您可以檢查可能的m通過以下regex

email = email.replaceAll("ca[n|r][e|a][e|a]r", "career"));

+0

感謝這個額外的幫助.. – Neeraj 2013-02-12 06:33:11

+0

歡迎您 – iTech 2013-02-12 06:34:23

+0

如果真的是'[N | R]'和朋友而不是'[NR]'&Co嗎? – 2013-02-12 13:26:57