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)
- ваш друг.
Ответ 5
В Java параметр \p{Print}
указывает класс символов печати.
Ответ 6
Добавление к @Alan-Moore, \P{Cc}
на самом деле является примером Negative Unicode Category or Unicode Block
(ref: Классы символов в регулярных выражениях). \P{name}
соответствует любому символу, который не принадлежит к общей категории Unicode или именованному блоку. См. Упомянутую ссылку для получения дополнительных примеров именованных блоков, поддерживаемых в .Net