0

のスマイリーを置き換える次の関数があります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'/>");

2 行目の変更に注意してください。

基本的に、右括弧をエスケープしないと、左括弧が抜けているとパーサーが判断して混乱します。したがって、括弧をエスケープする必要があります。一方、昔ながらの文字 (この例では D ) は、正規表現構造の一部を形成しないため、エスケープする必要はありません。

于 2013-09-03T05:31:45.117 に答える
1

コード セグメントは完全に機能するはずですが、2 番目のパターンがスマイリーに一致し、その後&に 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 に答える