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

时间:2010-01-12 14:18:41

标签: java string

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

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

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

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

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

喝彩!

7 个答案:

答案 0 :(得分:43)

好吧,您可以使用regular expression查找“米兰”未跟随“Vasic”的案例:

Milan(?! Vasic)

并将其替换为全名:

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

(?!...)部分是negative lookahead,可确保括号中的部分后面没有匹配。它不会消耗匹配中的任何字符。

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

(?<=Milan)(?! Vasic)

你可以只用" Vasic"替换它(注意字符串开头的空格):

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

例如,你可以试试here

答案 1 :(得分:23)

另一种选择:

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

答案 2 :(得分:8)

一种可能性,在扩展所有内容之前减少更长的形式:

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

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

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

其他人已经根据lookaheadalternation描述了解决方案。

答案 3 :(得分:4)

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

而不是用“Milan Vasic”替换所有“米兰”弦乐。

答案 4 :(得分:3)

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

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

  

“不要重新发明轮子”

答案 5 :(得分:3)

试试这个:

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);
}

答案 6 :(得分:1)

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

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