Android:Pattern.UNICODE_CASE 不匹配变音符号

标签 android regex pattern-matching diacritics

我有一个名称正则表达式,我希望与变音符号匹配。这是我的代码中的一个日志 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 字母字符)。这样,您甚至不需要 iu 修饰符。喜欢:

\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 \-.',]*

Working demo.

关于Android:Pattern.UNICODE_CASE 不匹配变音符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17385975/

相关文章:

regex - sed 和 regex 中逗号 ","的所有含义是什么?

java - 为什么这个多行 Java 模式不匹配?

java - Spring AntRequestMatcher 不匹配

android - 如何使用flash builder生成有效期为100年的p12证书

段落的正则表达式匹配

javascript - AngularJs 中数字的正则表达式

matlab - 我的多元核估计计算有什么问题?

android - 如何在不与其他 View 冲突的情况下在布局中心对齐 textView?

android-activity - 启动 Activity 时的平板电脑 Android 方向

android - 警报设置为 UTC 时间戳。不是我当前的系统时间