2013-07-22 3 views
3

Я пытаюсь обернуть голову вокруг разбора emoji из iOS 6 с помощью regex.Parsing iOS 6 emoji с регулярным выражением

Я хочу, чтобы каждое появление emoji было заменено на spannable, где я заменяю код emoji своим изображением в своих Ресурсах. До сих пор я не мог заставить его работать.

То, что я до сих пор:

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; 
} 

(Я понимаю, что это не готовый к производству еще, создание рисунка на каждый раз, когда вызывается функция убийца производительности я просто пытаюсь получить. работающее регулярное выражение.)

Текущее регулярное выражение соответствует небольшому количеству эмози. Я хотел бы как можно больше разложить его на факторизацию и получить в нем полный набор символов emoji.

Как только я пытаюсь разложить факторизацию, он больше не работает. Например, это не работает:

"\ud83d[\udc00-\uddff]" 

Даже меньше, когда я пытаюсь

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

, который должен (если работает) соответствовать каждый Emoji, присутствующий в кодировке.

+0

возможный дубликат [ php найти emoji \ [обновить exis ting code \]] (http://stackoverflow.com/questions/10564068/php-find-emoji-update-existing-code) – chx

ответ

1

Java-движок регулярных выражений ведет себя как хороший Unicode регулярных выражений должен в этом он соответствует Unicode, кодовые не UTF-16 char s. Кажется, вы пишете свой шаблон, ожидая последнего поведения.

Не делайте этого - вместо этого при указании символов астральной плоскости в регулярном выражении Java используйте шестнадцатеричное обозначение для полного значения кодовой точки. Например, чтобы соответствовать значению ЗАПИСИ РУКОВОДСТВА, используйте \x{1f44f}.

Итак, ваше последнее регулярное выражение (которое будет соответствовать частному месту использования BMP, блоку «Различные символы и пиктограммы», блоку «Смайлики», блоку «Символы транспорта» и «Карта символов»), блоку «Алхимические символы» и справедливой части нераспределенного пространства в ? SMP кроме того - вы уверены, что вам нужно, чтобы соответствовать все из них) должны быть оказаны как:

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

может быть, вы можете посмотреть на реализацию addEmojis в https://github.com/rockerhieu/emojicon/blob/master/library/src/main/java/com/rockerhieu/emojicon/EmojiconHandler.java

+1

Обратите внимание, что [ссылки только ответы] (http://meta.stackoverflow.com/ теги/ссылки-только-ответы/информация) не рекомендуется, SO-ответы должны быть конечной точкой поиска решения (vs. еще одна остановка ссылок, которые со временем становятся устаревшими). Пожалуйста, подумайте о добавлении отдельного резюме здесь, сохранив ссылку в качестве ссылки. – kleopatra

-1
Pattern pUnicode6 = Pattern.compile("[\uD83C\uDC04-\uD83C\uDD9A]|([\uD83C\uDDE8-\uD83C\uDDFA][\uD83C\uDDE7-\uD83C\uDDFA])|[\uD83C\uDE01-\uD83D\uDEC0])"); 
Смежные вопросы