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 

但是当我在每次替换后将结果分配给新的String时,它工作正常。 为什么在同一个String中连续赋值不起作用?

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

句点( . )和管道( | )一样具有特殊含义,大括号( } )也是如此。 你需要将它们全部转义,例如:

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

(这是Java吗?)

请注意,在Java中,replaceAll接受正则表达式,并且点匹配任何字符。 你需要逃避点或使用

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

还要注意这里的拼写错误:

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

应该

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

通过认识到replaceAll()第一个参数是regex你可以使你的比较更少

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

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

你必须逃脱. 通过\\. 如下:

 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; 

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

请使用\或使用Pattern.quote方法来逃避它们

我想你不知道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] 

并以领先的\\逃避其他特殊字符