2013-07-22 3 views
3

정규식을 사용하여 iOS 6에서 이모티콘을 분석 할 때 머리를 감싸려고합니다.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; 
} 

(I이 생산 준비가 아직되지 않습니다 실현, 패턴을 함수가 호출 될 때마다 생성하면 성능 킬러 난 그냥 얻으려고하다 정규 표현식 매칭 작업.)

현재 정규 표현식은 적은 수의 이모티콘과 일치합니다. 나는 그것을 가능한 한 많이 인수 분해하고 그것에 완전한 이모티콘 문자셋을 얻고 싶습니다.

분해하려고하면 더 이상 작동하지 않습니다. 예를 들어,이 작동하지 않습니다

"\ud83d[\udc00-\uddff]" 

심지어 덜 나는 (일 경우) 캐릭터 세트로 매 이모티콘 선물을 일치해야

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

을하려고 할 때.

+0

중복 가능성에 addEmojis의 구현을 살펴 가질 수있다 [ PHP 이모티콘 찾기 \ [업데이트 exis ting 코드 \]] (http://stackoverflow.com/questions/10564068/php-find-emoji-update-existing-code) – chx

답변

1

자바 정규 표현식 엔진은 에서 유니 코드 코드 포인트가 아닌 UTF-16 char 일치해야 좋은 유니 코드 정규 표현식 엔진처럼 동작합니다. 당신은 후자의 행동을 기대하는 당신의 패턴을 쓰는 것처럼 보입니다.

대신 Java 정규 표현식에서 별표 문자를 지정할 때 전체 코드 포인트 값에 16 진수 표기법을 사용하십시오. 예를 들어, CLAPPING HANDS SIGN과 일치 시키려면 \x{1f44f}을 사용하십시오.

그래서 마지막 정규식 (BMP 개인 사용 영역, 기타 기호 및 그림 블록, 이모티콘 블록, 전송 및지도 기호 블록, 화학 기호 블록 및 할당되지 않은 공간의 공정한 비트와 일치하는 마지막 정규식 ? - SMP 게다가 당신은) 당신이 그 모든 일치 할 필요는 확신으로 렌더링해야합니다

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

참고 [링크 전용 답변] (http://meta.stackoverflow.com/ tags/link-only-answers/info)은 권장하지 않습니다. 따라서 SO 답변은 솔루션 검색의 종점이어야합니다 (vs. 시간이 지남에 따라 부실 해지는 경향이있는 참조의 또 다른 중간 기착). 링크를 참조 용으로 유지하면서 독립형 시놉시스를 여기에 추가하는 것을 고려해보십시오. – kleopatra

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