我想用Java中的正则表达式提取以大写字母开头的单词 - 包括重音大写字母。
这是以大写字母A到Z开头的单词的条件:
if (link.text().matches("^[A-Z].+") == true)
但我也想要以重音大写字母开头的单词。
你有什么想法吗?
答案 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)