我正在寻找在Java中查找和替换字符串的最佳方法。
这是一句话:“我的名字是米兰,人们都知道我是米兰·瓦西奇”。
我想用米兰·瓦西奇取代米兰,但在我已经拥有米兰·瓦西奇的地方,这不应该是一个案例。
搜索/替换后的结果应该是:“我的名字是米兰·瓦西奇,人们知道我是米兰·瓦西奇”。
我尝试使用indexOf()和Pattern/Matcher组合,但我的结果看起来都不优雅,有人有优雅的解决方案吗?
干杯!
发布于 2010-01-12 22:20:45
嗯,你可以用regular expression来查找"Milan“后面不跟”Vasic“的情况:
Milan(?! Vasic)并将其替换为全名:
String.replaceAll("Milan(?! Vasic)", "Milan Vasic")(?!...)部件是一个negative lookahead,它确保任何匹配的内容都不会跟在括号中的部件后面。它不会消耗匹配本身中的任何字符。
或者,您可以简单地在名字后面插入姓氏(从技术上讲,替换为零宽度匹配),除非它后面已经跟了姓氏。这看起来很相似,但也使用了positive lookbehind:
(?<=Milan)(?! Vasic)您可以仅将其替换为" Vasic" (请注意字符串开头的空格):
String.replaceAll("(?<=Milan)(?! Vasic)", " Vasic")例如,你可以在here上尝试这些东西。
发布于 2010-01-12 22:28:39
另一种选择:
"My name is Milan, people know me as Milan Vasic"
.replaceAll("Milan Vasic|Milan", "Milan Vasic"))发布于 2010-01-12 22:21:43
一种可能性是,先减少较长的表单,然后再展开所有:
string.replaceAll("Milan Vasic", "Milan").replaceAll("Milan", "Milan Vasic")另一种方式,将Vasic视为可选的:
string.replaceAll("Milan( Vasic)?", "Milan Vasic")其他人则描述了基于lookahead或alternation的解决方案。
https://stackoverflow.com/questions/2049528
复制相似问题