Regex для всех символов PRINTABLE

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

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

Ответ 1

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

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

Ответ 2

Если ваш аромат регулярного выражения поддерживает свойства Unicode, это, пожалуй, лучший лучший способ:

\P{Cc}

Соответствует любому символу, который не является управляющим символом, будь то ASCII - [\x00-\x1F\x7F] - или Latin1 - [\x80-\x9F] (также известный как управляющие символы C1).

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

Ответ 3

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

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

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

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

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

Ответ 4

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

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

Ответ 6

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