Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Unicode字母与Java正则表达式匹配(例如)_Java_Regex_Unicode_Character Properties_Character Class - Fatal编程技术网

将Unicode字母与Java正则表达式匹配(例如)

将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

这里有许多关于StackOverflow的问题和答案,假设一个“字母”可以通过
[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”不相等。。。