2013-06-30 41 views
2

我有一個名稱的正則表達式,我希望匹配變音符號。下面是從開始我的代碼記錄片段與test.java:191: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 

我似乎無法得到一個音調符號 - 敏感的正則表達式匹配工作。這是一個Android錯誤還是我錯過了什麼?根據documentation,對於Android不區分大小寫的字符串,UNICODE_CASE總是處於開啓狀態,所以我甚至不需要它(真的不知道爲什麼會這樣,但這是一個不同的討論)。

回答

2

A-Z仍然只匹配ASCII字母。

改爲使用Unicode屬性\p{L}(任何Unicode字母字符)。這樣,您甚至不需要iu修改器。像:

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

雖然可能還有一個問題。在Unicode中,帶有變音符號的字符也可以由多個字符表示。例如,á可以是單個Unicode字符(U+00E1),或者可以是aU+0061),後面跟着組合標記´U+0301)。 \p{L}僅匹配獨立字符,不匹配標記。因此,爲了捕捉這些情況下,也可能會要組合標記的Unicode屬性插入重複以及:

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

Working demo.

+0

優秀的,謝謝。它在這方面似乎與iOS不同。 – Oded

+0

@Oded我剛剛注意到可能有另一個問題(並編輯答案) –

+0

它會工作以匹配Unicode字母數字? –