使用正则表达式检测以重音大写字母开头的单词
我想用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 )