代码之家  ›  专栏  ›  技术社区  ›  vaske

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

  •  27
  • vaske  · 技术社区  · 15 年前

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

    这是一句话:“我叫米兰,人们都知道我叫米兰·瓦西奇。”

    我想用米兰-瓦西奇取代米兰,但在我已经拥有米兰-瓦西奇的地方,那不应该是一个例子。

    搜索/替换后的结果应该是:“我叫米兰·瓦西奇,人们都知道我叫米兰·瓦西奇”。

    我尝试使用indexof()和模式/匹配器组合,但我的结果看起来都不优雅,有人有优雅的解决方案吗?

    干杯!

    7 回复  |  直到 13 年前
        1
  •  43
  •   Joey Gumbo    15 年前

    好吧,你可以用 regular expression 找到“米兰”后面没有“瓦西奇”的案例:

    Milan(?! Vasic)
    

    并将其替换为全名:

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

    这个 (?!...) 部分是 negative lookahead 它确保匹配的内容后面不跟括号中的部分。它不使用匹配本身中的任何字符。

    或者,您可以简单地在名字后面插入姓氏(从技术上来说,可以替换零宽度的匹配项),除非它后面已经有姓氏了。这看起来类似,但使用 positive lookbehind 也:

    (?<=Milan)(?! Vasic)
    

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

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

    你可以试试这些东西 here 例如。

        2
  •  23
  •   McDowell rahul gupta    15 年前

    另一种选择:

    "My name is Milan, people know me as Milan Vasic"
        .replaceAll("Milan Vasic|Milan", "Milan Vasic"))
    
        3
  •  8
  •   Community CDub    7 年前

    一种可能性是,在扩展之前减少较长的形状:

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

    另一种方法,治疗 瓦西奇 可选:

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

    其他人描述的解决方案基于 lookahead alternation .

        4
  •  4
  •   Markus Lausberg    15 年前

    当你不想把你的手按规则表达(也许你应该这样做)时,你可以先用“米兰”代替所有的“米兰-瓦西奇”弦。

    而不是用“米兰-瓦西奇”取代所有的“米兰”弦。

        5
  •  3
  •   Alasdair    15 年前

    简单地包括 Apache Commons Lang jar并使用org.apache.commons.lang.stringutils类。您会注意到许多安全有效地替换字符串的方法。

    您可以在先前链接的网站上查看StringUtilsAPI。

    “不要重新发明轮子”

        6
  •  3
  •   lsiu    15 年前

    试试这个:

    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);
    }
    
        7
  •  1
  •   GuruKulki    15 年前

    您也可以使用模式匹配器,它将在一次拍摄中全部替换。

    pattern key pattern=pattern.compile(key); matcher matcher=keypattern.matcher(str); string nersrting=matcher.replaceall(值);