将Unicode字母与Java正则表达式匹配(例如)
这里有许多关于StackOverflow的问题和答案,假设一个“字母”可以通过将Unicode字母与Java正则表达式匹配(例如),java,regex,unicode,character-properties,character-class,Java,Regex,Unicode,Character Properties,Character Class,这里有许多关于StackOverflow的问题和答案,假设一个“字母”可以通过[a-zA-Z]在regexp中匹配。然而,使用Unicode时,大多数人会将更多的字符视为字母(所有希腊字母,Cyrllic..,还有更多的字符。每个字符都可能有“字母” Java对alpha字符等的定义,但该定义仅适用于US-ASCII。预定义的字符类将单词定义为由[a-zA-Z_0-9]组成,这也排除了许多字母 那么,如何正确地匹配Unicode字符串呢?是否有其他库正确地匹配了这一点?您是否在谈论Unicode
[a-zA-Z]
在regexp中匹配。然而,使用Unicode时,大多数人会将更多的字符视为字母(所有希腊字母,Cyrllic..,还有更多的字符。每个字符都可能有“字母”
Java对alpha字符等的定义,但该定义仅适用于US-ASCII。预定义的字符类将单词定义为由[a-zA-Z_0-9]
组成,这也排除了许多字母
那么,如何正确地匹配Unicode字符串呢?是否有其他库正确地匹配了这一点?您是否在谈论Unicode类别,如字母?这些类别由形式为
\p{CAT}
的正则表达式匹配,其中“CAT”任何字母的类别代码如L
,大写字母的类别代码如Lu
,标题字母的类别代码如Lt
。引用自
Unicode支持
这个类符合
Unicode技术标准第1级#18:,加上RL2.1规范等价物
Unicode转义序列,例如
\u2014在Java中的源代码是
按照的中所述进行处理
Java语言规范
还实现了转义序列
直接通过正则表达式
语法分析器,以便可以使用Unicode转义
用于从中读取的表达式
文件或从键盘输入。因此
字符串“\u2014”和“\\u2014”,而
不相等,编译成相同的
模式,它与角色匹配
具有十六进制值0x2014
Unicode块和类别是
使用\p和\p构造编写
与Perl中一样。\p{prop}匹配
输入具有属性prop,而
\如果输入
有那个属性。块是
使用中的前缀指定,如中所示
蒙古语。类别可以是
使用可选前缀指定的是:
\p{L}和\p{IsL}都表示
Unicode字母的分类.块
和类别可以在内部和外部使用
在角色类之外
支持的类别是
版本中的Unicode标准
由字符类指定
类别名称是在中定义的名称
标准,包括规范性标准和
信息性。支持的块名称
“按模式”是有效的块名
接受并定义为
unicode deblock.forName
这里有一个很好的解释: 一些提示: 很遗憾,Java和.NET不支持
\X
(尚未)。请使用\p{M}\p{M}*
作为替代。要匹配任意数量的图形,请使用(?:\p{M}\p{M}*)+
,而不是\X+
在Java中,正则表达式标记
\uFFFF
仅与指定的代码点匹配,即使您启用了规范等效。但是,同样的语法\uFFFF
也用于在Java源代码中将Unicode字符插入文本字符串。模式.compile(\u00E0”)
将匹配的单码点编码和双码点编码,而Pattern.compile(\\u00E0)
只匹配单代码点版本。请记住,当将正则表达式作为Java字符串文字编写时,必须转义反斜杠。前一个Java代码编译正则表达式a
,而后一个代码编译\u00E0
。根据您所做的操作,差异可能很大。”这可能也会有帮助-@spinning_plate,谢谢。我确实搜索了现有的问题,但没有找到那个问题。@Pointy-你说得对,你不需要指定子类别。我可以很好地提供Java规范的链接,但没有注意到它同时显示了和\p{L}和\p{IsL}以Unicode字母的类别为例:(这里有一个类别列表,尽管关于为什么“\p{L}”不够,请参见@eLobato的答案。谢谢。该页面还指出了为什么\p{L}
不足以匹配任何字母(您需要\p{L}\p{M}*
)应该对其进行编辑,以在其中一个Pattern.compile语句中显示双斜杠。格式化程序正在使用双斜杠。这应该是:因此字符串“\u2014”和“\\u2014”不相等。。。