java中的字符串replaceAll(“¾”)

时间:2013-12-19 15:55:33

标签: java regex string replaceall

我的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变成“½”?

7 个答案:

答案 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实例,您可以添加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;
    }