3

我正在尝试使用正则表达式从 iOS 6 解析表情符号。

我希望每次出现的表情符号都被替换为可扩展的,我将表情符号代码替换为资源中的图像。到目前为止,我还无法让它工作。

到目前为止我所拥有的:

static public Spannable getSpannable(String str) {
    Spannable spannable = spannableFactory.newSpannable(str);
    char c = str.charAt(0);
    Pattern p = Pattern.compile("([\ud83d\ude01-\ud83d\ude45])");
    Matcher m = p.matcher(str);
    while (m.find()) {
        if (mSpannables.get(m.group()) == null) {
            Bitmap b = BitmapFactory.decodeResource(myApp.getAppContext().getResources(), R.drawable.u0033);
            ImageSpan imp = new ImageSpan(Bitmap.createScaledBitmap(b, 70, 70, false));
            mSpannables.put(m.group(), imp);
        }
        spannable.setSpan(mSpannables.get(m.group()), m.start(), m.end(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    }
    return spannable;
}

(我意识到这还没有准备好生产;每次调用函数时创建模式都是性能杀手。我只是想让正则表达式匹配工作。)

当前的正则表达式匹配少量的表情符号。我想尽可能地分解它,并在其中获取完整的表情符号字符集。

一旦我尝试分解,它就不再起作用了。例如,这不起作用:

"\ud83d[\udc00-\uddff]"

当我尝试时甚至更少

"[\ue000-\uf8ff]|\ud83c[\udf00-\udfff]|\ud83d[\udc00-\uddff]"

它应该(如果有效)匹配字符集中存在的每个表情符号。

4

3 回答 3

1

Java 正则表达式引擎的行为类似于一个好的 Unicode 正则表达式引擎,因为它匹配 Unicode 代码点,而不是 UTF-char 16 您似乎正在编写期望后一种行为的模式。

不要这样做 - 相反,当在 Java 正则表达式中指定星体平面字符时,对完整的代码点值使用十六进制表示法。例如,要匹配 CLAPPING HANDS SIGN,请使用\x{1f44f}.

因此,您的最后一个正则表达式(将与 BMP 私人使用区域、杂项符号和象形文字块、表情符号块、运输和地图符号块、炼金术符号块以及 SMP 中相当多的未分配空间相匹配 - 是你确定你需要匹配所有这些吗?)应该呈现为:

"[\ue000-\uf8ff]|[\\x{1f300}-\\x{1f7ff}]"
于 2013-11-12T10:25:40.127 回答
0

也许你可以看看https://github.com/rockerhieu/emojicon/blob/master/library/src/main/java/com/rockerhieu/emojicon/EmojiconHandler.javaaddEmojis中的实现

于 2014-01-19T10:03:00.120 回答
-1
Pattern pUnicode6  = Pattern.compile("[\uD83C\uDC04-\uD83C\uDD9A]|([\uD83C\uDDE8-\uD83C\uDDFA][\uD83C\uDDE7-\uD83C\uDDFA])|[\uD83C\uDE01-\uD83D\uDEC0])");
于 2014-02-28T09:34:18.400 回答