Я никогда не сопоставлял шаблоны с дополнительными символами, но я думаю, что это так же просто, как кодировать их (в шаблонах и строках), как два 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).