web-dev-qa-db-ja.com

String.replaceAll()が機能していません

私はtesseract ocrからのメールを編集しています。

ここに私のコード:

 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;

しかし、出力は正しくありません。

入力:

amrut=ac.hrworks@g mai|.com

出力:

lalcl.lhlrlwlolrlklsl@lglmlalil|l.lclolml

しかし、置換のたびに結果を新しいストリングに割り当てた場合、正常に機能します。同じ文字列での連続割り当てが機能しないのはなぜですか?

18
Neeraj

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

ピリオド(.)は、パイプ(|)中括弧(})。次のようなすべてをエスケープする必要があります。

email = email.replaceAll("gmaii\\.com", "gmail.com");
38
Brian Roach

(これはJavaですか?)

Javaでは、replaceAllは正規表現を受け入れ、ドットは任意の文字に一致することに注意してください。ドットをエスケープするか、使用する必要があります

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

ここのタイプミスにも注意してください。

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

あるべき

email = email.replaceAll("canear", "career");
10
David M. R.

replaceAll()最初の引数がregexであることを認識することで、比較をはるかに少なくすることができます

たとえば、次のcareerにより、Word regexのスペルミスをチェックできます。

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

6
iTech

次のように.likeで\\.をエスケープする必要があります。

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;
6
Sumit Singh

いくつかの正規表現文字を使用しています。

\を使用するか、Pattern.quoteメソッドを使用してエスケープしてください

5
Thihara

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]

先行する\\で他の特殊文字をエスケープします

5