使用正则表达式检测以重音大写字母开头的单词

时间:2011-03-26 14:14:59

标签: java regex unicode diacritics

我想用Java中的正则表达式提取以大写字母开头的单词 - 包括重音大写字母。

这是以大写字母A到Z开头的单词的条件:

if (link.text().matches("^[A-Z].+") == true) 

但我也想要以重音大写字母开头的单词。

你有什么想法吗?

3 个答案:

答案 0 :(得分:4)

http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

开始
\p{javaUpperCase}   Equivalent to java.lang.Character.isUpperCase()

答案 1 :(得分:4)

要匹配字符串开头的大写字母,您需要使用模式^\p{Lu}

不幸的是,Java不支持强制\p{Uppercase}属性,这是满足UTS#18’s RL1.2所必需的。

这几乎不是Java正则表达式中唯一能够满足甚至是最简单的基本Unicode功能的Level 1。如果没有Level 1,您实际上无法使用正则表达式进行Unicode测试。太多被打破或缺席。

悉尼科技大学#18的RL1.1将最终与JDK7相遇,但我不相信目前有任何计划会遇到RL1.2,RL1.2a或任何其他人目前缺乏,甚至没有达到两项强有力的建议。唉!

实际上,在RL1.2所要求的非常短的强制属性列表中,Java缺少\p{Alphabetic}\p{Uppercase}\p{Lowercase}\p{White_Space},{{1 }},\p{Noncharacter_Code_Point}\p{Default_Ignorable_Code_Point}\p{ANY}属性。这些都是强制性的,但要么完全缺失,要么就其定义而言不遵守Unicode标准。这也是Java中POSIX兼容属性的问题:它们在UTS#18方面都被打破了。

在JDK7之前,它还缺少必需的\p{ASSIGNED}属性。 JDK7确实最终得到了脚本属性,但这就是全部 - 没有别的。 Java甚至还远没有达到RL1.2a,这对于数以万计的程序员来说是日常的问题。

在JDK7中,如果它们是块,脚本或一般类别,您最终还可以使用Script形式的两部分属性。这意味着这些在JDK7的Pattern类中都是相同的:

  • \p{name=value}\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}之类的长格式,而且从RL1.2a的角度看,POSIX外观属性都已被破坏。 RL1.2的超级基本属性,如\ p {White_Space}和\ p {Alphabetic}仍然缺失。

有人谈到尝试修复\p{Letter_Number}\b,这些问题在\B\w方面遭到了严重破坏,但我不知道他们是怎么回事在没有完全遵守RL1.2a的情况下,我会解决所有问题。不,我不知道他们何时会将这些基本属性添加到Java。没有它们,你也无法摆脱它。

要使用Java中的regex,甚至Level 1完全使用Unicode,您实际上无法使用Java附带的标准Pattern类。最简单的方法是使用谷歌Android代码(使用 )来使用JNI连接ICU正则表达式库。 确实存在与UTS#18至少符合Level-1(或更好)的其他语言,但如果你想留在Java中,ICU目前是你自己的真正选择。

答案 2 :(得分:1)

java有一个方法java.lang.Character.isUpperCase,它不完全是正则表达式,但可能满足。

http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Character.html#isUpperCase(int