String x = "axe pickaxe";
x = x.replace("axe", "sword");
System.out.print(x);
Run Code Online (Sandbox Code Playgroud)
通过这段代码,我试图axe
用sword
.替换确切的单词.但是,如果我运行它,它会打印,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)
其他一些答案建议您使用\\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不支持变长后向断言。