【问题标题】:Match a Thai Script character in Java匹配 Java 中的泰语字符
【发布时间】:2011-07-18 03:35:08
【问题描述】:

在过去的两个小时里,我有很多性感的时间来处理我数据库中的泰文字符串。它们神秘地排列,输出时变异,没有自然顺序,是一场灾难。

我想忽略任何带有泰语字符的字符串,但我不知道如何:

Pattern.compile("\\p{Thai}") 初始化失败。 "[ก-๛]" - 那会起作用吗?正确的方法是什么?

【问题讨论】:

标签: java regex unicode thai


【解决方案1】:

Thai是一个Unicode块,Unicode块应该指定为\p{In...}

Pattern.compile("\\p{InThai}") 

【讨论】:

  • +1 刚刚尝试了一个测试编译/运行,以确保在投票和删除我的答案之前。 Pattern 对上述内容很满意。
  • @Daniel:十年前的 Unicode 3.0 列表有什么好处,而去年 Unicode 已经达到 6.0? :(
【解决方案2】:

当您指的是 Unicode 脚本时,您不应该使用 Unicode 块。例如,฿(Unicode 中的代码点 U+0E3F THAI CURRENCY SYMBOL BAHT)是 \p{Block=Thai} ᴀᴋᴀ \p{InThai} 字符,但它不是 \p{Script=Thai} ᴀᴋᴀ \p{IsThai} 字符。它是\p{Script=Common} 集合的货币符号。

对于像希腊语这样的大型系列来说尤其如此。希腊语块中有 18 个码点不在希腊文中,希腊文中有 250 个码点不在希腊文块中。

幸运的是,您不必担心这里有泰语的人,因为从 Unicode 6.0 开始,这里只有 U+0E3F 是一个异常值。在这方面你是双重幸运的,因为标准 Java 不支持 Java 7 之前的 Unicode 脚本;奇怪但真实。对于 JDK7 之前的版本中的 Unicode 脚本支持,您必须使用 JNI 来获取 ICU 正则表达式库,就像 Google 在 Android 上为 Java 所做的那样。不过,他们的方法有很多好处,因此即使是 JNI,也值得考虑。

【讨论】:

  • 我知道问题是关于 Java 的,但对于 Perl,5.6 以上的版本\p{Script=Thai} 可以写成\p{Thai}\p{IsThai} 也适用于向后兼容)。
猜你喜欢
  • 2013-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-24
相关资源
最近更新 更多