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

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

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

if (link.text().matches("^[AZ].+") == true) 

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

你有什么想法?

从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的RL1.2所必需的 。

这几乎不是Java正则表达式中唯一能够满足甚至是最简单的基本Unicodefunction的Level 1。 如果没有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}forms的两部分属性。 这意味着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}\p{Letter_Number}之类的长格式,并且从RL1.2a的角度看,POSIX外观属性都已破坏。 RL1.2的超级基本属性,如\ p {White_Space}和\ p {Alphabetic}仍然缺失。

有一些关于尝试修复\b\B说法,它们在\w\W方面被惨遭打破,但我不知道他们如何在没有完全遵守RL1.2a的情况下解决所有问题。 不,我不知道他们什么时候会将这些基本属性添加到Java。 没有它们你也不能顺其自然。

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

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

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