使用Java regexp匹配(例如)Unicode字母

The*_*aul 14 java regex unicode character-class character-properties

StackOverflow上有许多问题和答案,假设"字母"可以在正则表达式中匹配[a-zA-Z].然而,对于Unicode,还有更多的字符,大多数人会认为是一个字母(所有希腊字母,Cyrllic ..还有更多.Unicode定义了许多块,每个可能有"字母".

Java定义 为像alpha字符这样的东西定义了Posix类,但是它被指定为仅使用US-ASCII.预定义的字符类定义要包含的单词[a-zA-Z_0-9],这也排除了许多字母.

那么如何正确匹配Unicode字符串呢?是否有其他图书馆可以做到这一点?

eLo*_*ato 15

在这里你有一个非常好的解释:

http://www.regular-expressions.info/unicode.html

一些提示:

"遗憾的是,Java和.NET不支持\X(还).\P{M}\p{M}*用作替代.要匹配任意数量的字素,请使用(?:\P{M}\p{M}*)+而不是\X+."

"在Java中,正则表达式令牌\uFFFF只匹配指定的代码点,即使您打开规范等效.但是,相同的语法\uFFFF也用于将Unicode字符插入Java源代码中的文字字符串.Pattern.compile("\u00E0")将匹配单个代码点和双码点编码à,虽然Pattern.compile("\\u00E0")只匹配单码点版本.请记住,当将正则表达式编写为Java字符串文字时,必须转义反斜杠.前Java代码编译正则表达式à,而后者编译正则表达式编译\u00E0,取决于你在做什么,差异可能是显著".

  • 谢谢.该页面还指出了为什么`\ p {L}`**不足以匹配任何字母(你需要`\ p {L}\p {M}*`) (5认同)
  • 应该编辑它以在其中一个Pattern.compile语句中显示双斜杠. (2认同)

eri*_*son 5

你在谈论Unicode类别,比如字母吗?这些由表单的正则表达式匹配\p{CAT},其中"CAT"是类似于L任何字母的类别代码,或类似于Lu大写或Lt标题大小写的子类别.

  • 我认为只是"一封信"就是'\ p {L}`对吗? (2认同)
  • 虽然看到@ eLobato的答案为什么'\ p {L}'还不够. (2认同)