使用正则表达式解析iOS 6表情符号

时间:2013-07-22 14:10:21

标签: android regex utf-8 emoji

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

我希望每次出现的表情符号都被一个spannable替换,在那里我用我的资源中的图像替换表情符号代码。到目前为止,我还没能让它发挥作用。

到目前为止我所拥有的:

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]"

应该(如果工作)匹配charset中存在的每个表情符号。

3 个答案:

答案 0 :(得分:1)

Java正则表达式引擎的行为就像一个好的Unicode正则表达式引擎应该在它匹配Unicode代码点,而不是UTF-16 char s 。你似乎正在编写你的模式,期待后一种行为。

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

所以你的最后一个正则表达式(它将匹配BMP专用区,杂项符号和象形文字块,表情符号块,传输和映射符号块,Alchemical符号块以及SMP中的一些未分配空间)此外 - 你确定你需要匹配所有这些吗?)应该呈现为:

"[\ue000-\uf8ff]|[\\x{1f300}-\\x{1f7ff}]"

答案 1 :(得分:0)

答案 2 :(得分:-1)

Pattern pUnicode6  = Pattern.compile("[\uD83C\uDC04-\uD83C\uDD9A]|([\uD83C\uDDE8-\uD83C\uDDFA][\uD83C\uDDE7-\uD83C\uDDFA])|[\uD83C\uDE01-\uD83D\uDEC0])");