用 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验证用户只可输入数字下划线字母的例子