Похоже, было бы интересно использовать класс Guava CharMatcher . Используя таблицы, связанные в ответе Джека, я создал это:
public class JapaneseCharMatchers {
public static final CharMatcher HIRAGANA =
CharMatcher.inRange((char) 0x3040, (char) 0x309f);
public static final CharMatcher KATAKANA =
CharMatcher.inRange((char) 0x30a0, (char) 0x30ff);
public static final CharMatcher KANA = HIRAGANA.or(KATAKANA);
public static final CharMatcher KANJI =
CharMatcher.inRange((char) 0x4e00, (char) 0x9faf);
public static void main(String[] args) {
test("誰か確認上記これらのフ");
}
private static void test(String string) {
System.out.println(string);
System.out.println("Hiragana: " + HIRAGANA.retainFrom(string));
System.out.println("Katakana: " + KATAKANA.retainFrom(string));
System.out.println("Kana: " + KANA.retainFrom(string));
System.out.println("Kanji: " + KANJI.retainFrom(string));
}
}
Выполнение этой команды печатает ожидаемое:
誰 か 確認 上 記 こ れ ら の フ
Хирагана: 101 こ れ ら の
Катакана: 101
Кана: か こ れ ら の フ
Кандзи: 101 確認 上 記
Это дает вам много возможностей для работы с японским текстом, определяя правила для определения того, находится ли персонаж в одной из этих групп в объекте, который может не только сам выполнять много полезных дел, но также может использоваться с другими API, такими как Splitter
класс Guava.
Edit:
Основываясь на ответе jleedev, вы также можете написать такой метод:
public static CharMatcher inUnicodeBlock(final Character.UnicodeBlock block) {
return new CharMatcher() {
public boolean matches(char c) {
return Character.UnicodeBlock.of(c) == block;
}
};
}
и используйте его как:
CharMatcher HIRAGANA = inUnicodeBlock(Character.UnicodeBlock.HIRAGANA);
Я думаю, что это может быть немного медленнее, чем в другой версии.