我正试着用正则表达式从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中存在的每个表情符号。
答案 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)
addEmojis
的实施情况
答案 2 :(得分:-1)
Pattern pUnicode6 = Pattern.compile("[\uD83C\uDC04-\uD83C\uDD9A]|([\uD83C\uDDE8-\uD83C\uDDFA][\uD83C\uDDE7-\uD83C\uDDFA])|[\uD83C\uDE01-\uD83D\uDEC0])");