String x = "axe pickaxe";
x = x.replace("axe", "sword");
System.out.print(x);
通过此代码,我尝试将axe
替换为sword
。但是,如果我运行此功能,则会打印sword picksword
,而我只打印sword pickaxe
,因为pickaxe
与axe
不同,尽管它包含/etc/sysconfig/elasticsearch
。我怎样才能解决这个问题?感谢
答案 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断言。
答案 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