В данной строке есть символ unicode «\ ud84c \ udfb4». Согласно javadoc, соответствие регулярному выражению должно выполняться на уровне кодовой точки, а не на уровне символов. Тем не менее, разделенный код ниже рассматривает низкий суррогат (\ udfb4) как символ без слова и разбивается на него.Java 7, регулярные выражения и символы дополнительного уникода
Я что-то упустил? Каковы другие альтернативы для разделения на символы, отличные от слов? (Версия Java «1.7.0_07»)
Заранее спасибо.
Pattern non_word_regex = Pattern.compile("[\\W]", Pattern.UNICODE_CHARACTER_CLASS);
String a = "\u529f\u80fd\u0020\u7d76\ud84c\udfb4\u986f\u793a\u5ee3\u544a";
String b ="功能 絶顯示廣告";
System.out.print("original "+a+"\norginal hex ");
for(char c : a.toCharArray()){
System.out.print(Integer.toHexString((int)c));
System.out.print(' ');
}
System.out.println();
String[] tokens = non_word_regex.split(a);
for(int i =0; i< tokens.length; i++){
String token = tokens[i];
System.out.print(i+" ");
for(char c : token.toCharArray()){
System.out.print(Integer.toHexString((int)c));
System.out.print(' ');
}
System.out.println();
}
Выход:
оригинальный 功能 絶 顯示 廣告
оригинал гекс 529f 80fd 20 7d76 d84c dfb4 986f 793a 5ee3 544а
0 529f 80fd
1 7d76 d84c
2 986f 793a 5ee3 544а
К сожалению, Matcher не сохраняет границы слов. Используя «[^ \\ w]» предсказательно, дает тот же результат, что и «[\\ W]« Должен ли я размещать его на досках Java где-нибудь? – user3088039
@ user3088039 Я только что решил проблему! Проверьте ответ еще раз, я обновил его. – Malcolm
Вы думаете, что «(? U)» включит дополнительную поддержку персонажа. Спасибо, что посмотрели под обложки. Он работает красиво. – user3088039