【问题标题】:How do I match unicode characters in Java如何在 Java 中匹配 unicode 字符
【发布时间】:2011-03-07 09:51:02
【问题描述】:

我正在尝试在 Java 中匹配 unicode 字符。

输入字符串:informa

要匹配的字符串:informátion

到目前为止,我已经尝试过:

Pattern p= Pattern.compile("informa[\u0000-\uffff].*", (Pattern.UNICODE_CASE|Pattern.CANON_EQ|Pattern.CASE_INSENSITIVE));
    String s = "informátion";
    Matcher m = p.matcher(s);
    if(m.matches()){
        System.out.println("Match!");
    }else{
        System.out.println("No match");
    }

它显示为“不匹配”。有什么想法吗?

【问题讨论】:

  • îñfórmåtìön 怎么样?它应该“匹配!”吗?
  • 是的,就是这样。现在只需 á 就可以了。

标签: java regex unicode


【解决方案1】:

“Unicode 字符”一词不够具体。它将匹配 Unicode 范围内的 每个 字符,因此也匹配“普通”字符。然而,当一个实际上 表示“不在printable ASCII range 中的字符”时,这个术语经常被使用。

在正则表达式中,[^\x20-\x7E]

boolean containsNonPrintableASCIIChars = string.matches(".*[^\\x20-\\x7E].*");

根据您希望如何处理这些信息,以下是一些有用的后续答案:

【讨论】:

  • java.text.Normalizer 似乎是要走的路(第 2 条)。 Unicode 匹配似乎没有按预期工作,即使这样做,我也可能会受到性能损失。
  • 如果您的实际功能要求是“摆脱变音符号”,那么这确实是要走的路。你最初的问题只是没有这样表述:)
  • 我认为这个问题不是很清楚。目标是能够将“信息”与“信息”相匹配,从而能够将“a”与任何形式的“á”、“å”等相匹配。删除变音符号然后进行匹配似乎是一种方式去。
【解决方案2】:

是因为informa 根本不是informátion 的子字符串吗?

如果您在正则表达式中从informa 中删除最后一个a,您的代码将如何工作?

【讨论】:

【解决方案3】:

听起来您想匹配字母而忽略变音符号。如果正确,则将您的字符串规范化为 NFD 形式,去掉变音符号,然后进行搜索。

String normalized = java.text.Normalizer.normalize(textToSearch, java.text.Normalizer.Form.NFD);
String withoutDiacritical = normalized.replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
// Search code goes here...

要了解有关 NFD 的更多信息:

【讨论】:

    猜你喜欢
    • 2013-12-18
    • 2012-05-11
    • 2015-07-29
    • 2011-10-09
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多