我有一个名称正则表达式,我希望与变音符号匹配。这是我的代码中的一个日志 fragment ,以 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 ,对于 Android 不区分大小写的字符串,UNICODE_CASE 始终处于打开状态,因此我什至不需要它(真的不确定为什么会出现这种情况,但这是一个不同讨论的问题)。
最佳答案
A-Z
仍然仅匹配 ASCII 字母。
改用 Unicode 属性 \p{L}
(任何 Unicode 字母字符)。这样,您甚至不需要 i
或 u
修饰符。喜欢:
\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 \-.',]*
关于Android:Pattern.UNICODE_CASE 不匹配变音符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17385975/