Java查找和替换字符串的最佳方法?

我正在寻找Java中字符串查找和替换的最佳方法。

这是一句话:“我的名字是米兰,人们都认为我是米兰瓦西奇”。

我想用米兰瓦西奇取代米兰队,但在我已经有米兰瓦西奇的地方,这不应该是一个案例。

搜索/替换后的结果应该是:“我的名字是米兰瓦西奇,人们都认识我为米兰瓦西奇”。

我尝试使用indexOf()以及Pattern / Matcher组合,但我的结果都不优雅,有人有优雅的解决方案吗?

干杯!

那么,您可以使用正则表达式来查找“米兰”未跟随“Vasic”的情况:

Milan(?! Vasic) 

并用全名替换:

 String.replaceAll("Milan(?! Vasic)", "Milan Vasic") 

(?!...)部分是一个负前瞻 ,它确保括号中的部分不跟随任何匹配。 它不会消耗匹配中的任何字符。

或者,您可以简单地插入(在技术上替换零宽度匹配)名字后面的姓氏,除非它后面跟着姓氏。 这看起来很相似,但也使用积极的lookbehind :

 (?<=Milan)(?! Vasic) 

您可以通过" Vasic"替换它(注意字符串开头的空格):

 String.replaceAll("(?<=Milan)(?! Vasic)", " Vasic") 

例如,你可以尝试这些东西。

另外一个选项:

 "My name is Milan, people know me as Milan Vasic" .replaceAll("Milan Vasic|Milan", "Milan Vasic")) 

一种可能性,在扩展所有之前减少更长的forms:

 string.replaceAll("Milan Vasic", "Milan").replaceAll("Milan", "Milan Vasic") 

另一种方法,将Vasic视为可选:

 string.replaceAll("Milan( Vasic)?", "Milan Vasic") 

其他人已经描述了基于先行或替代的解决方案 。

如果你不想把你的手正式表达(可能你应该),你可以先用“米兰”取代所有“Milan Vasic”字符串。

而不是用“Milan Vasic”取代所有“米兰”弦乐。

只需包含Apache Commons Lang JAR并使用org.apache.commons.lang.StringUtils类。 您会注意到许多安全有效地替换字符串的方法。

您可以在以前链接的网站上查看StringUtils API。

“不要重新发明轮子”

尝试这个:

 public static void main(String[] args) { String str = "My name is Milan, people know me as Milan Vasic."; Pattern p = Pattern.compile("(Milan)(?! Vasic)"); Matcher m = p.matcher(str); StringBuffer sb = new StringBuffer(); while(m.find()) { m.appendReplacement(sb, "Milan Vasic"); } m.appendTail(sb); System.out.println(sb); } 

你也可以使用模式匹配器,它将一次性取代所有。

模式keyPattern = Pattern.compile(key); Matcher matcher = keyPattern.matcher(str); String nerSrting = matcher.replaceAll(value);