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

Java 使用正则表达式检测以重音大写字母开头的单词,java,regex,unicode,diacritics,Java,Regex,Unicode,Diacritics,我想使用Java中的正则表达式提取以大写字母开头的单词,包括重音大写字母 这是我对大写字母A到Z开头的单词的条件: if (link.text().matches("^[A-Z].+") == true) 但我也想要以重音大写字母开头的单词 你有什么想法吗?java有一个方法java.lang.Character.isUpperCase,它不完全是一个正则表达式,但可能满足以下条件 )从 要匹配字符串开头的大写字母,需要使用模式^\p{Lu} 不幸的是,Java不支持会议所必需的强制性\p{

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

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

if (link.text().matches("^[A-Z].+") == true) 
但我也想要以重音大写字母开头的单词


你有什么想法吗?

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

)


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

不幸的是,Java不支持会议所必需的强制性
\p{Uppercase}
属性

这并不是Java正则表达式在满足第1级(最基本的Unicode功能)时缺少的唯一东西。如果没有级别1,就无法使用正则表达式进行Unicode测试。太多的东西坏了或缺了

UTS#18的RL1.1最终将与JDK7会面,但我不认为目前有任何计划满足RL1.2、RL1.2a或其目前缺乏的任何其他要求,甚至也不满足这两个强有力的建议。唉

事实上,在RL1.2所要求的非常短的强制属性列表中,Java缺少
\p{alphatic}
\p{Uppercase}
\p{Lowercase}
\p{White_Space}
\p{Noncharacter code{code}点
\p{Default Default Ignorable{code}点
\p},以及
\p}
属性。这些都是强制性的,但要么完全缺失,要么就其定义而言不符合Unicode标准。这也是Java中与POSIX兼容的属性的问题:它们都与UTS#18有关

在JDK7之前,它还缺少必需的
脚本
属性。JDK7最终确实获得了脚本属性,但仅此而已——没有别的了。Java距离实现RL1.2a还有几光年的时间,而RL1.2a是数不清的程序员每天都会遇到的问题

在JDK7中,如果属性是块、脚本或常规类别,最后还可以以
\p{name=value}
的形式包含两部分的属性。这意味着这些在JDK7的模式类中都是相同的:

  • \p{Block=Number\u Forms}
    \p{blk=Number\u Forms}
    \p{InNumber\u Forms}
  • \p{Script=Latin}
    \p{sc=Latin}
    \p{IsLatin}
    ,以及
    \p{Latin}
  • \p{General\u Category=Lu}
    \p{GC=Lu}
    \p{Lu}
但是,您仍然不能使用长格式,如
\p{Lowercase_Letter}
\p{Letter_Number}
,并且从RL1.2a的角度来看,POSIX外观的属性都被破坏了。另外,RL1.2中的超基本属性,如\p{White_Space}和\p{alphastic}仍然缺失

有人谈论试图修复
\b
\b
,它们在
\w
\w
方面严重受损,但我不知道如果不完全遵守RL1.2a,它们将如何修复所有这些问题。不,我不知道他们什么时候会把这些基本属性添加到Java中。没有他们你也活不下去

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

我把链接搞乱了。现在好多了。从技术上讲,Java的j.l.Character的isUpperCase()只实现Unicode通用类别大写字母。但是,您可以改用,它测试二进制Unicode属性大写字母,而不是常规类别大写字母。这两者有细微的区别,GC=Lu缺少42个代码点。还有31个GC=Lt代码点,这可能也应该考虑在内。是的,它可能对大多数人来说已经足够好了,尽管它遗漏了标题字母和所有非字母大写的代码点(有一些在
\pN
中,还有一些在
\pS
中)。@Porges:如果你使用ICU正则表达式,所有这些东西都会丢失(还有更多)消失了。只是你只能通过JNI才能找到它们。
\p{javaUpperCase}   Equivalent to java.lang.Character.isUpperCase()