Я нашел интересное регулярное выражение в проекте Java: "[\\p{C}&&\\S]"
Я понимаю, что &&
означает "установить пересечение", а \S
- "не-whitespace", но что такое \p{C}
, и можно ли использовать?
java.util.regex.Pattern documentation не упоминает об этом. Единственный подобный класс в списке - \p{Cntrl}
, но они ведут себя по-разному: оба они совпадают с управляющими символами, но \p{C}
совпадает дважды с символами Юникода выше U + FFFF, например PILE OF POO
:
public class StrangePattern {
public static void main(String[] argv) {
// As far as I can tell, this is the simplest way to create a String
// with code points above U+FFFF.
String poo = new String(Character.toChars(0x1F4A9));
System.out.println(poo); // prints `💩`
System.out.println(poo.replaceAll("\\p{C}", "?")); // prints `??`
System.out.println(poo.replaceAll("\\p{Cntrl}", "?")); // prints `💩`
}
}
Единственное упоминание, которое я нашел где-то, здесь:
\ p {C} или \p {Other}: невидимые управляющие символы и неиспользуемые кодовые точки.
Однако \p{Other}
, похоже, не существует в Java, а совпадающие кодовые точки не используются.
Информация о моей версии Java:
$ java -version
java version "1.8.0_92"
Java(TM) SE Runtime Environment (build 1.8.0_92-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.92-b14, mixed mode)
Бонусный вопрос: каково вероятное намерение исходного шаблона, "[\\p{C}&&\\S]"
? Это происходит в методе, который проверяет строку перед ее отправкой по электронной почте: если этот шаблон сопоставляется, возникает исключение с сообщением "Неверная строка".