19

tesseractocrから受け取ったメールを編集しています。

これが私のコードです:

 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

しかし、置換するたびに結果を新しい文字列に割り当てると、正常に機能します。同じ文字列での連続代入が機能しないのはなぜですか?

4

6 に答える 6

43

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

ピリオド(.)は、パイプ(|)と同様に、中括弧(})と同様に特別な意味を持ちます。次のように、それらすべてをエスケープする必要があります。

email = email.replaceAll("gmaii\\.com", "gmail.com");
于 2013-02-12T05:44:31.160 に答える
12

(これはJavaですか?)

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

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

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

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

する必要があります

email = email.replaceAll("canear", "career");
于 2013-02-12T05:52:08.890 に答える
6

あなたは次のように脱出する必要があり.ます\\.

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;
于 2013-02-12T05:47:12.337 に答える
6

replaceAll()最初の議論がregexあなたの比較をはるかに少なくすることができるということを理解することによって

たとえばcareer、次の方法で単語のスペルミスの可能性を確認できます。regex

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

于 2013-02-12T06:11:21.390 に答える
5

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

\またはPattern.quote方法を使用してそれらをエスケープしてください

于 2013-02-12T05:47:21.810 に答える
5

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]

先頭にある他の特殊文字をエスケープします\\

于 2013-02-12T05:47:37.960 に答える