Я никогда не выполнял сопоставление шаблонов с дополнительными символами, но я думаю, что это так же просто, как закодировать их (в шаблонах и строках) как два 16-битных числа (суррогатная пара UTF-16) \unnnn\ummmm . java.util.regex
должен быть достаточно умен, чтобы интерпретировать эти два числа (символы Java) как один символ в шаблонах и строках (хотя Java по-прежнему будет рассматривать их как два символа, как элементы строки).
Две ссылки:
Кодировка Java Unicode
http://java.sun.com/developer/technicalArticles/Intl/Supplementary/< /а>
Из последней ссылки (относится к Java 5):
Пакет java.util.regex был обновлен таким образом, что строки шаблонов и целевые строки могут содержать дополнительные символы, которые будут обрабатываться как целые единицы.
Также обратите внимание, что если вы используете UTF8 в качестве кодировки (для ваших исходных файлов), вы также можете написать их напрямую (см. раздел «Представление дополнительных символов в исходных файлах» в последней ссылке).
Например:
String pat1 = ".*\uD840\uDC00{2}.*";
String s1 = "HI \uD840\uDC00\uD840\uDC00 BYE";
System.out.println(s1.matches(pat1) + " len=" + s1.length());
String pat2 = ".*\u0040\u0041{2}.*";
String s2 = "HI \u0040\u0041\u0040\u0041 BYE";
System.out.println(s2.matches(pat2) + " len=" + s2.length());
Это, скомпилированное с Java 6, печатает
true len=11
false len=11
что согласуется с вышесказанным. В первом случае у нас есть одна кодовая точка, представленная в виде пары суррогатных символов Java (два 16-битных символа, один дополнительный символ Unicode), и к паре применяется квантификатор {2}
(= кодовая точка). Во втором у нас есть два разных символа BMP, квантификатор применяется к последнему — следовательно, совпадений нет.
Обратите внимание, однако, что длина строки одинакова (поскольку Java измеряет длину строки, считая символы Java, а не кодовые точки Unicode).
person
leonbloy
schedule
23.03.2011