0

我有以下功能来替换 a 中的笑脸String

public String replaceSmileys(String text) {
    for (Entry < String, String > smiley: smileys.entrySet())
        text = text.replaceAll(smiley.getKey(), smiley.getValue());
    return text;
}

static HashMap < String, String > smileys = new HashMap < String, String > ();
smileys.put("&:\\)", "<img src='http://url.com/assets/1.png'/>");
smileys.put("&:\\D", "<img src='http://url.com/assets/2.png'/>");
smileys.put("&;\\)", "<img src='http://url.com/assets/3.png'/>");


String sml = replaceSmileys(msg);

我收到此错误: java.util.regex.PatternSyntaxException: Unknown character property name {} near index 4 &:\P

任何想法我做错了什么?

4

3 回答 3

7

只有你的括号需要被转义,而不是你的文字字符。所以:

smileys.put("&:\\)", "<img src='http://url.com/assets/1.png'/>");
smileys.put("&:D", "<img src='http://url.com/assets/2.png'/>");
smileys.put("&;\\)", "<img src='http://url.com/assets/3.png'/>");

注意第二行的变化。

基本上,如果你不转义右括号,解析器会感到困惑,因为它认为它错过了一个左括号。所以你必须转义括号。另一方面,普通的旧字母(在您的示例中为 D)不需要转义,因为它们不构成正则表达式构造的一部分。

于 2013-09-03T05:31:45.117 回答
1

代码段应该可以完美运行,除非第二个模式打算匹配笑脸而不是&后跟 a:和非数字字符,那么它应该是。

    smileys.put("&:D", "<img src='http://url.com/assets/2.png'/>");
于 2013-09-03T05:29:55.530 回答
0

它对我来说工作正常

public class Test {
    public static void main(String[] args) {
        String sml = replaceSmileys("&:)");
        System.out.println(sml);
    }

    static String replaceSmileys(String text) {
        HashMap < String, String > smileys = new HashMap < String, String > ();
        smileys.put("&:\\)", "<img src='http://url.com/assets/1.png'/>");
        smileys.put("&:D", "<img src='http://url.com/assets/2.png'/>");
        smileys.put("&;\\)", "<img src='http://url.com/assets/3.png'/>");
        for (Entry < String, String > smiley: smileys.entrySet())
            text = text.replaceAll(smiley.getKey(), smiley.getValue());
        return text;
    }
}

输出 -

<img src='http://url.com/assets/1.png'/>
于 2013-09-03T05:33:15.490 回答