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

Oti*_*Nai 24 java string

String x = "axe pickaxe";
x = x.replace("axe", "sword");
System.out.print(x);
Run Code Online (Sandbox Code Playgroud)

通过这段代码,我试图axesword.替换确切的单词.但是,如果我运行它,它会打印,sword picksword而我只想打印sword pickaxe,虽然它包含它pickaxe,axe但它是一个不同的单词.我怎样才能解决这个问题?谢谢

hie*_*tfu 40

使用带有字边界 的正则表达式\b:

String s = "axe pickaxe";
System.out.println(s.replaceAll("\\baxe\\b", "sword"));
Run Code Online (Sandbox Code Playgroud)

必须转义边界符号的反斜杠,因此需要双反斜杠.


Sub*_*mal 15

在要替换的单词之前和之后包括单词边界.

String x = "axe pickaxe axe";
x = x.replaceAll("\\baxe\\b", "sword");
System.out.print(x);
Run Code Online (Sandbox Code Playgroud)

编辑输出

sword pickaxe sword
Run Code Online (Sandbox Code Playgroud)


Avi*_*Raj 7

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

System.out.println(string.replaceAll("(?<!\\S)axe(?!\\S)", "sword"));
Run Code Online (Sandbox Code Playgroud)

说明:

  • (?<!\\S)负向后方断言匹配将不会以非空格字符开头。也就是说,匹配必须在线条边界或空格的开头。

  • (?!\\S)负向超前声明断言匹配将不包含非空格字符,即匹配必须位于行边界或空格的末尾。我们无法使用,(?<=^|\\s)axe(?=\\s|$)因为Java不支持变长后向断言。

演示

  • 如果您解释了((?&lt;!\\ S)` (2认同)