Java - 字符串替换确切的单词

时间:2015-05-12 06:54:39

标签: java string

String x = "axe pickaxe";
x = x.replace("axe", "sword");
System.out.print(x);

通过此代码,我尝试将axe替换为sword。但是,如果我运行此功能,则会打印sword picksword,而我只打印sword pickaxe,因为pickaxeaxe不同,尽管它包含/etc/sysconfig/elasticsearch 。我怎样才能解决这个问题?感谢

6 个答案:

答案 0 :(得分:34)

使用带word boundaries \b的正则表达式:

String s = "axe pickaxe";
System.out.println(s.replaceAll("\\baxe\\b", "sword"));

边界符号的反斜杠必须被转义,因此是双反斜杠。

答案 1 :(得分:13)

在要替换的单词之前和之后包含单词边界。

String x = "axe pickaxe axe";
x = x.replaceAll("\\baxe\\b", "sword");
System.out.print(x);

修改输出

sword pickaxe sword

答案 2 :(得分:4)

其他一些答案建议您使用\\b字边界来匹配确切的字词。但是\\bfoo\\b会匹配foo中的子字符串.foo.。如果您不想要这种类型的行为,那么您可以考虑使用基于环绕声的正则表达式。

System.out.println(string.replaceAll("(?<!\\S)axe(?!\\S)", "sword"));

<强>解释

  • (?<!\\S)负面的lookbehind,断言匹配不会以非空格字符开头。即,匹配必须在行边界开始或空格之前。

  • (?!\\S)否定前瞻声明匹配不会跟随非空格字符,即匹配必须后跟行边界或空格的结尾。我们不能使用(?<=^|\\s)axe(?=\\s|$),因为Java不支持可变长度的lookbehind断言。

DEMO

答案 3 :(得分:2)

System.out.println("axe pickaxe".replaceAll("\\baxe\\b", "sword"));

您需要使用replaceAll而不是replace - 因为它可以使用正则表达式。然后使用元字符\ b,这是字边界。为了使用它,你需要将\转义为\,因为双重成为\\baxe\\b

答案 4 :(得分:1)

您可以使用\b来定义单词边界,在这种情况下为\baxe\b

x = x.replaceAll("\\baxe\\b");

答案 5 :(得分:0)

如果您只想替换第一个匹配项,replaceFirst对象中有一个方法String

String x = "axe pickaxe";
x = x.replaceFirst("axe", "sword");
System.out.print(x); //returns sword pickaxe