2013-06-30 2 views
2

발음 구별 기호와 일치시키려는 이름의 정규식이 있습니다. 여기에 내 코드에서 로깅 조각은 test.java:191로 시작됩니다 : I 입력 "ü"를 사용할 때 여기 Android : Pattern.UNICODE_CASE가 분음 기호와 일치하지 않습니다.

Util.Log("text = " + text); 
Util.Log("regex = " + regex); 
Util.Log("regexorig = " + regexorig); 
Util.Log("Matches static: " + Pattern.matches(text, regex)); 
Pattern p1 = Pattern.compile(regex); 
Util.Log("Matches p1: " + p1.matcher(text).matches()); 
Pattern p2 = Pattern.compile(regexorig, Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE); 
Util.Log("Matches p2: " + p2.matcher(text).matches()); 
Util.Log("String matches: " + text.matches(regex)); 

출력입니다 :

LOG: (test.java:191):text = ü 
LOG: (test.java:192):regex = (?iu)[A-Z][A-Z0-9 \-.',]* 
LOG: (test.java:193):regexorig = [A-Z][A-Z0-9 \-.',]* 
LOG: (test.java:194):Matches static: false 
LOG: (test.java:196):Matches p1: false 
LOG: (test.java:198):Matches p2: false 
LOG: (test.java:199):String matches: false 

내가 분음 부호를 얻이 수없는 것 -insensitive 정규식이 작동합니다. 이것은 안드로이드 버그인가요, 아니면 제가 빠진 것이 있습니까? documentation에 따르면 UNICODE_CASE는 Android의 대소 문자를 구분하지 않는 문자열을 위해 항상 켜져 있으므로 필요하지 않아야합니다. (실제로 그런 이유는 확실치 않지만 다른 토론에서는 중요합니다).

답변

2

A-Z은 여전히 ​​ASCII 문자와 일치합니다.

유니 코드 속성 \p{L} (유니 코드 문자)을 대신 사용하십시오. 이렇게하면 i 또는 u 수정자가 필요하지 않습니다. 좋아요 :

\p{L}[\p{L}0-9 \-.',]* 

더 많은 문제가있을 수 있습니다. 유니 코드에서는 발음 구별 부호가있는 문자를 여러 문자로 나타낼 수도 있습니다. 예를 들어, á은 단일 유니 코드 문자 (U+00E1)이거나 a (U+0061)이어서 조합 기호 ´ (U+0301)이 올 수 있습니다. \p{L}은 독립형 문자에만 일치하지만 표시는 결합되지 않습니다. 따라서,뿐만 아니라 이러한 경우를 잡기 위해, 당신은뿐만 아니라 반복에 결합 마크의 유니 코드 속성을 삽입 할 수 있습니다

\p{L}[\p{L}\p{M}0-9 \-.',]* 

Working demo.

+0

우수, 감사합니다. 이 점에있어서 iOS와는 다른 것으로 보입니다. – Oded

+0

@Oded 방금 문제에 대한 또 다른 캐치가있을 수 있음을 알아 냈습니다. (대답을 편집했습니다) –

+0

유니 코드의 영숫자와 일치시킬 수 있습니까? –

관련 문제