我的java代码中有一些奇怪的错误,无法弄清楚是什么问题。
假设我有这段代码:
private void test()
{
String test1 = replace("1.25");
String test2 = replace("1.5");
String test3 = replace("1.75");
}
private String replace(String s)
{
s = s.replaceAll(".25", "¼");
s = s.replaceAll(".5", "½");
s = s.replaceAll(".75", "¾");
return s;
}
然后结果将是:
test1 =“¼”
test2 =“½”
test3 =“½”??????????
有人可以解释为什么test3变成“½”?
答案 0 :(得分:27)
您正在使用replaceAll()
,它采用正则表达式。在正则表达式中,.
表示“任何角色”。请改用replace()
,它适用于文字字符串。
答案 1 :(得分:8)
因为replaceAll
采用正则表达式。这意味着.
被解释为也匹配7
的通配符,以便.5
匹配75
。您可以使用\
在正则表达式中进行转义,但请注意,这也是一个字符串,这意味着您必须转义两次:所以replaceAll("\\.5", "½")
将执行您想要的操作。
答案 2 :(得分:5)
问题在于,正则表达式.
表示任何字符。 replaceAll
将正则表达式作为参数,因此您应该使用其他方法,例如replace
。
答案 3 :(得分:3)
replace all函数将第一个参数解释为正则表达式。 “.5”作为正则表达式将匹配任何后跟5的字符串,就像你的字符串test2一样。逃离'。'带有反斜杠的字符:
s = s.replaceAll("\\.25", "¼");
答案 4 :(得分:3)
replaceAll
使用正则表达式作为需要找到的第一个参数,正则表达式中的点.
是元字符,它将匹配除新行之外的所有字符。所以当你使用
s = s.replaceAll(".5", "½");
"1.75"
.5
上的可以匹配75
(因为.
匹配所有)。所以经过这样的改变
1.75
-- will become
1.½
(请注意,1.25
只能在.25
之前使用.5
)才能正常工作
要防止此类行为,您需要转义点。你可以通过
来做到这一点\
(请记住要创建\
字面值,您需要将其写为"\\"
)"\\."
,[.]
,\Q
和\E
围绕它,代表引用的开头和结尾\\Q.\\E
\Q
和\E
也可以使用Pattern.quote(".")
Pattern.LITERAL
标志以使模式文字中使用所有元字符。如果您希望我们的整个模式都是简单的文字,您可以使用replace
代替replaceAll
,它会自动使用Pattern.LITERAL
标记并将所有正则表达式元字符更改为简单的文字。
所以你可以试试像
这样的东西return s.replaceAll("\\.25", "¼").replaceAll("\\.5", "½").replaceAll("\\.75", "¾");
或更简单
return s.replace(".25", "¼").replace(".5", "½").replace(".75", "¾");
答案 5 :(得分:1)
replaceAll()的第一个参数是REGEX,'。'表示REGEX区域中的任何字符。
答案 6 :(得分:1)
使用String.replace()
代替String.replaceAll()
这样做
private String replace(String s)
{
s = s.replace(".25", "¼");
s = s.replace(".5", "½");
s = s.replace(".75", "¾");
return s;
}