我正在寻找在Java中进行字符串查找和替换的最佳方法。
这是一个句子:“我的名字是米兰,人们知道我是米兰瓦希奇。”
我想用"Milan Vasic"替换字符串"Milan",但是如果已经有“Milan Vasic”,就不应该替换。
搜索/替换后结果应为:“我的名字是 Milan Vasic,人们知道我是 Milan Vasic。”
我尝试使用indexOf()和Pattern / Matcher组合,但是我的结果都不够简洁优雅。是否有其他更优雅的解决方案?
干杯!
我正在寻找在Java中进行字符串查找和替换的最佳方法。
这是一个句子:“我的名字是米兰,人们知道我是米兰瓦希奇。”
我想用"Milan Vasic"替换字符串"Milan",但是如果已经有“Milan Vasic”,就不应该替换。
搜索/替换后结果应为:“我的名字是 Milan Vasic,人们知道我是 Milan Vasic。”
我尝试使用indexOf()和Pattern / Matcher组合,但是我的结果都不够简洁优雅。是否有其他更优雅的解决方案?
干杯!
好的,你可以使用正则表达式来查找那些后面不跟着"Vasic"的情况下出现了"Milan"的案例:
Milan(?! Vasic)
并将其替换为全名:
String.replaceAll("Milan(?! Vasic)", "Milan Vasic")
(?!...)
部分是负向预查,确保匹配的内容后面没有括号内的内容。它不会在匹配本身中消耗任何字符。
另外,你也可以简单地在名字后面插入(实际上是替换零宽度匹配),除非它已经后跟了姓氏。这看起来类似,但同时使用了正向回顾:
(?<=Milan)(?! Vasic)
您可以通过仅使用" Vasic"
(请注意字符串开头的空格)来替换此内容:
String.replaceAll("(?<=Milan)(?! Vasic)", " Vasic")
(?=Vasic)
,把后行断言改为负向断言:(?<!Milan )
。 - Joey另外一个选项:
"My name is Milan, people know me as Milan Vasic"
.replaceAll("Milan Vasic|Milan", "Milan Vasic"))
当你不想使用正则表达式(也许你应该)时,你可以先将所有的“Milan Vasic”字符串替换为“Milan”。
然后再将所有的“Milan”字符串替换为“Milan Vasic”。
试试这个:
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);
}
只需包含Apache Commons Lang JAR文件,然后使用org.apache.commons.lang.StringUtils类。您会注意到有许多用于安全高效替换字符串的方法。
您可以在之前链接的网站上查看StringUtils API。
“不要重复造轮子”
您也可以使用模式匹配器,它将一次性替换所有匹配项。
Pattern keyPattern = Pattern.compile(key); Matcher matcher = keyPattern.matcher(str); String nerSrting = matcher.replaceAll(value);