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错误还是我错过了什么?根据文档,对于不区分大小写的 Android 字符串,UNICODE_CASE 始终处于启用状态,所以我什至不需要它(真的不知道为什么会这样,但这是另一个讨论的问题)。

4

1 回答 1

2

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

请改用 Unicode 属性\p{L}(任何 Unicode 字母字符)。这样,您甚至不需要ioru修饰符。像:

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

不过,可能还有一个问题。在 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 回答