2013-02-12 40 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行目にタイプミスを修正する)ことをコピー&ペースト、それは正しい結果であると思われるものになります。 [email protected] " – Ren

+3

replaceAllの代わりにString.replaceを使用することを検討してください。私がreplaceAllがやるべきと思っているとまったく同じことをします。 – Buhb

+2

私の目はそのようなコードを見ることで痛いです。 –

答えて

34

Javadoc for String.replaceAll()には、最初の引数がregular expressionであることに注意してください。

期間(.)は中括弧(})と同じようにパイプ(|)と同様に特別な意味を持ちます。あなたは次のように\\..をエスケープする必要が

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

私はエスケープする必要がありますか? { – Neeraj

+3

はい。したがって、 "あなたはすべてを逃れなければなりません"。 –

+1

私はエスケープしました| by \\ |しかし、まだそれは交換されていません。他のすべてはうまく動作します – Neeraj

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は任意の文字と一致します。replaceAll()最初の引数は、あなたの比較を行うことができますregexであることを実現することによって

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

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

はい、Java。その誤植にも言及してくれてありがとう。私は訂正しました – Neeraj

6

する必要があります:あなたはまた、ここではタイプミスに注意してドットをエスケープするか、

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

を使用する必要がありますはるかに少ない

たとえば、可能なm 「amrut = AC - 次regex

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

+0

この追加のおかげでありがとう.. – Neeraj

+0

あなたは歓迎です – iTech

+0

'[nr]'とCoではなく '[n | r]'と友人でしょうか? –

関連する問題