在过去的两个小时里,我有很多性感的时间来处理我数据库中的泰文字符串。它们神秘地排列,输出时变异,没有自然秩序,是一场灾难。
我想忽略任何带有泰语字符的字符串,但我不知道如何:
Pattern.compile("\\p{Thai}")
初始化失败。"[ก-๛]"
- 那会奏效吗?正确的方法是什么?
Thai
是一个 Unicode 块,Unicode 块应指定为\p{In...}
:
Pattern.compile("\\p{InThai}")
当您指的是 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,也可能值得考虑。