用 Java 正则表达式匹配(例如)一个 Unicode 字母

Posted

技术标签:

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

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

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

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

【问题讨论】:

这可能也有帮助 - ***.com/questions/4304928/… @spinning_plate,谢谢。我确实搜索了现有问题,但没有找到。 【参考方案1】:

这里有一个很好的解释:

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

一些提示:

“遗憾的是,Java 和 .NET 不支持 \X(目前)。使用 \PM\pM* 作为替代品。要匹配任意数量的字素,请使用 (?:\PM\pM*)+ 而不是 \X+。”

"在 Java 中,正则表达式标记 \uFFFF 仅匹配指定的代码点,即使您打开规范等价也是如此。但是,相同的语法 \uFFFF 也用于将 Unicode 字符插入到 Java 源中的文字字符串中代码。Pattern.compile("\u00E0") 将匹配à 的单码点和双码点编码,而Pattern.compile("\\u00E0") 仅匹配单码点版本。请记住,在将正则表达式编写为 Java 字符串时文字,反斜杠必须转义。前 Java 代码编译正则表达式 à,而后者编译 \u00E0。根据您的操作,差异可能很大。"

【讨论】:

谢谢。该页面还指出了为什么\pL不足以匹配任何字母(您需要\pL\pM* 这应该被编辑以在 Pattern.compile 语句之一中显示双斜杠。【参考方案2】:

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

【讨论】:

@Pointy - 你是对的,你不需要指定子类别。 可以。我设法提供了 Java 规范的链接,但没有注意到它以 Both \pL and \pIsL denote the category of Unicode letters 为例 :( 类别列表在这里 fileformat.info/info/unicode/category/index.htm 虽然看到 @eLobato 的回答为什么 '\pL' 还不够。【参考方案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 中一样。 \pprop 匹配,如果 输入具有属性道具,而 \Pprop 如果输入不匹配 有那个属性。块是 用前缀 In 指定,如 在蒙古语。类别可能是 用可选前缀指定是: \pL 和 \pIsL 都表示 Unicode 字母的类别。块 和类别都可以在里面使用 并且在字符类之外。

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

【讨论】:

格式化程序正在吃掉双斜线。这应该说:因此字符串“\u2014”和“\\u2014”,虽然不相等......

以上是关于用 Java 正则表达式匹配(例如)一个 Unicode 字母的主要内容,如果未能解决你的问题,请参考以下文章

求java正则表达式的例子,像js验证用户只可输入数字下划线字母的例子

怎么用正则表达式匹配小括号里内容(含括号)?

java 英文版QQ邮箱正则表达式怎么写(例如abcdefg.abc@qq.com)

Java 正则简单用法

java之endwith()方法以及正则表达式匹配中文

java中正则表达式基本用法