在java中只拆分中文字符

isr*_*kir 7 java regex split

我正在写一个java应用程序; 但坚持这一点.

基本上我有一串汉字,还有一些可能的拉丁字符或数字,让我们说:

??????????????210?????.
Run Code Online (Sandbox Code Playgroud)

我想将除拉丁语之外的中文字符或上面的数字分成"BOT".所以,最后我会有这样的清单:

[ ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 210, ???, ?, ?, ., ]

我该如何解决这个问题(对于java)?

Bal*_*usC 10

中文字符位于某些Unicode范围内:

  • 2F00-2FDF:康熙
  • 4E00-9FAF:CJK
  • 3400-4DBF:CJK扩展

所以你基本上需要做的就是检查角色的代码点是否在已知范围内.这个例子是编写基于堆栈的解析器/拆分器的一个很好的起点,你只需要将它扩展为拉丁字母的单独数字,这应该足够明显(提示:) Character#isDigit():

Set<UnicodeBlock> chineseUnicodeBlocks = new HashSet<UnicodeBlock>() {{
    add(UnicodeBlock.CJK_COMPATIBILITY);
    add(UnicodeBlock.CJK_COMPATIBILITY_FORMS);
    add(UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS);
    add(UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT);
    add(UnicodeBlock.CJK_RADICALS_SUPPLEMENT);
    add(UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION);
    add(UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS);
    add(UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A);
    add(UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B);
    add(UnicodeBlock.KANGXI_RADICALS);
    add(UnicodeBlock.IDEOGRAPHIC_DESCRIPTION_CHARACTERS);
}};

String mixedChinese = "??????????????210?????";

for (char c : mixedChinese.toCharArray()) {
    if (chineseUnicodeBlocks.contains(UnicodeBlock.of(c))) {
        System.out.println(c + " is chinese");
    } else {
        System.out.println(c + " is not chinese");
    }
}
Run Code Online (Sandbox Code Playgroud)

祝好运.