【问题标题】:Matching (e.g.) a Unicode letter with Java regexps用 Java 正则表达式匹配(例如)一个 Unicode 字母
【发布时间】:2011-07-15 23:29:51
【问题描述】:

StackOverflow 上有很多问题和答案,假设“字母”可以在正则表达式中由 [a-zA-Z] 匹配。然而,对于 Unicode,还有更多字符被大多数人视为字母(所有希腊字母、西里尔字母 .. 等等。Unicode defines many blocks 每个都可能有“字母”。

Java 定义 defines Posix classes 用于诸如字母字符之类的内容,但它被指定为仅适用于 US-ASCII。预定义的字符类将单词定义为由[a-zA-Z_0-9] 组成,这也排除了许多字母。

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

【问题讨论】:

标签: java regex unicode character-properties character-class


【解决方案1】:

这里有一个很好的解释:

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}*
  • 这应该被编辑以在 Pattern.compile 语句之一中显示双斜杠。
【解决方案2】:

您是在谈论 Unicode 类别,例如字母吗?这些由\p{CAT} 形式的正则表达式匹配,其中“CAT”是类别代码,如L 用于任何字母,或子类别如Lu 用于大写或Lt 用于标题大小写。

【讨论】:

  • @Pointy - 你是对的,你不需要指定子类别。
  • 可以。我设法提供了 Java 规范的链接,但没有注意到它以 Both \p{L} and \p{IsL} denote the category of Unicode letters 为例 :( 类别列表在这里 fileformat.info/info/unicode/category/index.htm
  • 虽然看到 @eLobato 的回答为什么 '\p{L}' 还不够。
【解决方案3】:

引用java.util.regex.Pattern的JavaDoc。

Unicode 支持

这个类符合 Unicode 技术标准 #18 的第 1 级:Unicode Regular Expression Guidelines,加上 RL2.1 规范等效项。

Unicode 转义序列,例如 \u2014 在 Java 源代码中是 按照§3.3 的描述进行处理 Java 语言规范。这样的 还实现了转义序列 直接通过正则表达式 解析器,以便 Unicode 转义可以 用于从 文件或从键盘。就这样 字符串“\u2014”和“\\u2014”,而 不相等,编译成一样 模式,匹配字符 十六进制值为 0x2014。

Unicode 块和类别是 用 \p 和 \P 结构编写 就像在 Perl 中一样。 \p{prop} 匹配,如果 输入具有属性道具,而 \P{prop} 如果输入不匹配 有那个属性。块是 用前缀 In 指定,如 在蒙古语。类别可能是 用可选前缀指定是: \p{L} 和 \p{IsL} 都表示 Unicode 字母的类别。块 和类别都可以在里面使用 并且在字符类之外。

支持的类别是 版本中的 Unicode 标准 由 Character 类指定。这 类别名称是在 标准,无论是规范性的还是 内容丰富。支持的块名称 by Pattern 是有效的块名称 接受和定义 UnicodeBlock.forName。

【讨论】:

  • 格式化程序正在吃掉双斜线。这应该说:因此字符串“\u2014”和“\\u2014”,虽然不相等......
猜你喜欢
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
  • 2014-03-04
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多