String.replaceAll()对某些字符串无效

22

我正在编辑一些从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;

但输出结果不正确。

输入:

But the output is not correct.

amrut=ac.hrworks@g mai|.com

输出:

lalcl.lhlrlwlolrlklsl@lglmlalil|l.lclolml

但是,每次替换后将结果分配给新的字符串后,它就可以正常工作。为什么在同一个字符串中不断赋值不起作用?


当我将其复制/粘贴进去(并修复第5行的拼写错误),结果似乎是正确的 -“amrut=ac.hrworks@gmail.com”。 - Ren
3
考虑使用String.replace而不是replaceAll。它会完全达到你原先期望的replaceAll的效果。 - Buhb
3
看到那样的代码,我的眼睛很痛。 - user
6个回答

45

你会注意到在String.replaceAll()的Javadoc中,第一个参数是一个正则表达式

句点(.)和竖线符号(|)以及花括号(})在此处具有特殊意义。您需要对它们进行转义,例如:

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

我需要转义 | 和 { 吗? - Neeraj
4
是的。因此,“你需要逃脱它们所有”。 - Brian Roach
1
我用 \| 转义了 |,但它仍然没有被替换。其他所有东西都正常工作。 - Neeraj
4
你在那里使用了String.replace()(我甚至没有注意到),这是不同的。它将一个CharSequence作为第一个参数(即一个String),你在那里不需要转义。 - Brian Roach
虽然我意识到了这点,但它从我的脑海中溜走了...谢谢你救了我一天。 - Dila Gurung
避免所有需要转义的内容的最佳方法是使用 Pattern.quote(String) - FiruzzZ

14

(这是Java吗?)

请注意,在Java中,replaceAll接受正则表达式,并且点可以匹配任何字符。您需要转义点或使用

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

还要注意这里有个拼写错误:

email = emai.replaceAll("canear", "career");
应该是。
email = email.replaceAll("canear", "career");

是的,Java。谢谢你提到那个错别字错误。我已经更正了。 - Neeraj

6

在IT技术中,如果需要转义字符.,需要使用\\.,示例如下:

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

通过意识到replaceAll()的第一个参数是regex,您可以使比较更少。

例如,您可以通过以下regex检查单词career的可能拼写错误:

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


1
这真的应该是[n|r]和其他类似的,而不是[nr]和诸如此类的吗? - user
可以的,我认为第一个更明确、更易读。 - iTech

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]

并使用前导 \\ 转义其他特殊字符。


5

你正在使用一些正则表达式字符。

请使用\进行转义或使用Pattern.quote方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接