Regex для всех печатных символов - PullRequest
12 голосов
/ 08 августа 2009

Существует ли специальное выражение регулярного выражения типа \ w, которое обозначает все печатаемые символы? Я хотел бы проверить, что строка содержит только символ, который может быть напечатан - т.е. не содержит управляющих символов ASCII, таких как \ b (звонок), или ноль, и т. д. Все на клавиатуре в порядке, как и символы UTF.

Если нет специального оператора, как я могу указать это в регулярном выражении?

Ответы [ 6 ]

17 голосов
/ 31 июля 2015

Очень поздно на вечеринку, но это регулярное выражение работает: /[ -~]/.

Как? Он соответствует всем символам в диапазоне от пробел (ASCII DEC 32) до тильда (ASCII DEC 126), то есть диапазон всех печатаемых символов.

Если вы хотите удалить символы не ASCII, вы можете использовать что-то вроде:

$someString.replace(/[^ -~]/g, '');

ПРИМЕЧАНИЕ: это не правильный код .net, но пример использования регулярных выражений для тех, кто позже наткнулся на это через поисковые системы.

14 голосов
/ 14 августа 2009

Если ваш регулярный выражение поддерживает Свойства 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.

9 голосов
/ 08 августа 2009

Существует обозначение класса символов POSIX [:print:], которое должно соответствовать печатным символам, и [:cntrl:] для управляющих символов. Обратите внимание, что эти коды соответствуют по всей таблице ASCII, поэтому они могут не подходить для сопоставления с другими кодировками.

В противном случае выражение [\x00-\x1f] будет соответствовать контрольным символам ASCII, хотя, опять же, они могут быть напечатаны в других кодировках.

1 голос
/ 08 августа 2009

В Java опция \p{Print} указывает класс печатных символов .

1 голос
/ 08 августа 2009

Это сильно зависит от того, какой пакет регулярных выражений вы используете. Это одна из тех ситуаций, в которых некоторые из них говорят, что самое важное в стандартах - выбор из множества.

Если вы используете C, функция / макрос isprint(3) - ваш друг.

0 голосов
/ 08 января 2016

При добавлении к @ Alan-Moore \P{Cc} фактически является примером Negative Unicode Category or Unicode Block (ref: Классы символов в регулярных выражениях ). \P{name} соответствует любому символу, который не принадлежит к общей категории Unicode или именованному блоку. См. Ссылку для получения дополнительных примеров именованных блоков, поддерживаемых в .Net

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...