Java 使用正则表达式检测以重音大写字母开头的单词
我想使用Java中的正则表达式提取以大写字母开头的单词,包括重音大写字母 这是我对大写字母A到Z开头的单词的条件: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{
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()