2

分音記号に一致させたい名前の正規表現があります。これは、test.java:191 で始まる私のコードのログ スニペットです。

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によると、UNICODE_CASEはAndroidの大文字と小文字を区別しない文字列に対して常にオンになっているため、必要ないはずです(なぜそうなのかは本当にわかりませんが、それは別の議論の問題です)。

4

1 に答える 1

2

A-ZASCII 文字のみに一致します。

代わりにUnicode プロパティ\p{L}(任意の Unicode 文字) を使用してください。iこのように、 oru修飾子さえ必要ありません。お気に入り:

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

ただし、もう 1 つ問題がある可能性があります。Unicode では、分音記号付きの文字も複数の文字で表すことができます。たとえばá、単一の Unicode 文字 ( U+00E1 )、またはa( U+0061 ) の後に結合記号´( U+0301 ) を指定できます。\p{L}単独の文字のみに一致し、記号を組み合わせたものには一致しません。したがって、これらのケースも同様にキャッチするには、結合マークの Unicode プロパティを繰り返しに挿入することもできます。

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

動作デモ。

于 2013-06-30T00:49:04.007 に答える