【发布时间】:2011-07-23 12:11:10
【问题描述】:
我想在 Java 中使用正则表达式提取以大写字母开头的单词(包括重音大写字母)。
这是我对以大写 A 到 Z 开头的单词的条件:
if (link.text().matches("^[A-Z].+") == true)
但我也想要以重音大写字符开头的单词。
你有什么想法吗?
【问题讨论】:
标签: java regex unicode diacritics
我想在 Java 中使用正则表达式提取以大写字母开头的单词(包括重音大写字母)。
这是我对以大写 A 到 Z 开头的单词的条件:
if (link.text().matches("^[A-Z].+") == true)
但我也想要以重音大写字符开头的单词。
你有什么想法吗?
【问题讨论】:
标签: java regex unicode diacritics
以http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html开头
\p{javaUpperCase} Equivalent to java.lang.Character.isUpperCase()
【讨论】:
要匹配字符串开头的大写字母,您需要模式^\p{Lu}。
不幸的是,Java 不支持强制 \p{Uppercase} 属性,这是满足 UTS#18’s RL1.2 所必需的。
这几乎不是 Java 正则表达式中唯一缺少的东西,即使是第 1 级,也就是最简单的基本 Unicode 功能。如果没有 Level 1,你真的无法使用正则表达式进行 Unicode 测试。太多的东西被破坏或缺失。
UTS#18 的 RL1.1最终将与 JDK7 相遇,但我不认为目前有任何计划与 RL1.2、RL1.2a 或其他任何它相遇目前缺乏,甚至没有满足两个强烈建议。唉!
确实,在 RL1.2 要求的非常短的强制性属性列表中,Java 缺少 \p{Alphabetic}、\p{Uppercase}、\p{Lowercase}、\p{White_Space}、\p{Noncharacter_Code_Point}、\p{Default_Ignorable_Code_Point}、\p{ANY}和\p{ASSIGNED} 属性。这些都是强制性的,但要么完全缺失,要么在其定义方面不遵守 Unicode 标准。这也是 Java 中与 POSIX 兼容的属性的问题:它们在 UTS#18 方面都被破坏了。
在 JDK7 之前,它还缺少必需的 Script 属性。 JDK7 最终确实获得了脚本属性,但仅此而已 - 仅此而已。 Java 距离达到 RL1.2a 仍有很长的路要走,这是无数程序员每天遇到的难题。
在 JDK7 中,如果它们是块、脚本或一般类别,您最终还可以采用 \p{name=value} 形式的两部分属性。这意味着这些在 JDK7 的 Pattern 类中都是一样的:
\p{Block=Number_Forms}、\p{blk=Number_Forms} 和 \p{InNumber_Forms}。\p{Script=Latin}、\p{sc=Latin}、\p{IsLatin} 和 \p{Latin}。\p{General_Category=Lu}、\p{GC=Lu} 和 \p{Lu}。但是,您仍然不能使用像 \p{Lowercase_Letter} 和 \p{Letter_Number} 这样的长格式,并且从 RL1.2a 的角度来看,看起来像 POSIX 的属性都被破坏了。再加上 RL1.2 中的超基本属性,如 \p{White_Space} 和 \p{Alphabetic} 仍然缺失。
有人谈到试图修复\b 和\B,它们在\w 和\W 方面被严重破坏了,但我不知道如果没有他们将如何解决所有这些问题完全符合 RL1.2a。不,我不知道他们什么时候会将这些基本属性添加到 Java 中。你也不能没有它们。
要在 Java 中使用正则表达式在级别 1 中完全使用 Unicode,您真的不能使用 Java 附带的标准 Pattern 类。最简单的方法是使用 JNI 来使用 Google Android 代码连接 ICU 正则表达式库, 可用。 确实存在其他至少与 UTS#18 1 级兼容(或更好)的语言,但如果你想留在 Java 中,ICU 目前是你自己的真正选择。
【讨论】:
java 有一个方法 java.lang.Character.isUpperCase,它不完全是正则表达式,但可能满足。
http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Character.html#isUpperCase(int)
【讨论】:
\pN 中有一些,\pS 中有一些)。