Если ваш регулярный выражение поддерживает Свойства Unicode , это, вероятно, лучший из лучших способов:
\P{Cc}
Соответствует любому символу, который не является управляющим символом, будь то ASCII - [\x00-\x1F\x7F]
- или Latin1 - [\x80-\x9F]
(также известный как управляющие символы C1).
Проблема с классами POSIX, такими как [:print:]
или \p{Print}
, заключается в том, что они могут соответствовать различным вещам в зависимости от вида регулярного выражения и, возможно, настроек локали базовой платформы. В Java они строго ASCII-ориентированы. Это означает, что \p{Print}
соответствует только печатным символам ASCII - [\x20-\x7E]
- в то время как \P{Cntrl}
(обратите внимание на заглавную 'P') соответствует всему, что не управляющий символ ASCII - [^\x00-\x1F\x7F]
. То есть он соответствует любому символу ASCII, который не является управляющим символом, или любому не-ASCII-символу, включая управляющие символы C1.