Как создать регулярное выражение Perl, которое соответствует не алфавитно-цифровым символам, кроме пробелов? - PullRequest
2 голосов
/ 20 октября 2010

У меня есть Perl регулярное выражение /\W/i, которое соответствует всем не буквенно-цифровым символам, но также соответствует пробелам, которые я хочу игнорировать Как мне сделать так, чтобы он соответствовал не буквенно-цифровым символам, кроме пробелов?

Ответы [ 3 ]

14 голосов
/ 20 октября 2010

Вы можете использовать

/[^\w\s]/

Это соответствует всем несловесным символам (\ w) и непропуску (\ s).

РЕДАКТИРОВАТЬ:

/[^\w ]/

Если вы хотите игнорировать только пробелы (не все пробелы).

ОБНОВЛЕНИЕ:

Удалено i, поскольку оно не требуется (см. Несколько комментариев).

8 голосов
/ 20 октября 2010

Для большинства целей достаточно [^\w\s]. Это соответствует только одному символу, который не является ни alphanumunder, ни PerlSpace.

Это почти, но не совсем то, что говорить, что оно соответствует ни чему, ни \p{Alphabetic}, ни \p{Digit}, ни подчеркиванию (НИЗКАЯ СТРОКА), ни \p{WhiteSpace}, за исключением ласкания в отношении chr 11, вертикальной табуляции, поскольку это не считается \s, хотя является считается \p{WhiteSpace}.

Маленькая \s стенография действительно менас \p{PerlSpace}, не \p{WhiteSpace}. И \p{Space} совпадает с \p{WhiteSpace}. Единственный символ \S (имеется в виду, а не \s), который также является \p{Space}, - это надоедливая вертикальная табуляция. Обратите внимание, что вертикальная табуляция включена в \v, поэтому [\v\h] для любого вертикального или горизонтального пробела совпадает с \p{Space}, а не \s.

Теперь я собираюсь уточнить алфавитно-цифровые символы. Для простоты я собираюсь поговорить о положительных совпадениях. Должно быть легко инвертировать логику, чтобы получить отрицательные совпадения.

Если под "буквенно-цифровым" вы подразумеваете либо буквы, либо цифры, вам, вероятно, следует использовать свойства, которые означают именно это. \pL - это сокращение от \p{Letter}, которое, вероятно, охватывает их. Все буквы алфавитные, но - это символов, которые \p{Alphabetic}, но не \p{Letter}, как римские цифры, буквы в кружках и различные диакритические знаки.

Для чисел, вопрос, хотите ли вы включать только цифры, или если другие числа в порядке. \pN - это сокращение от \p{Number}, но оно включает много не цифр. \d это сокращение от \p{Nd}, а это, в свою очередь, сокращение от \p{Decimal_Number}, хотя \p{Digit} тоже работает нормально. Числа, которые не являются цифрами, включают римские цифры, вульгарные дроби, числа с надписями и цифры в кружках.

Начиная некоторое время после Perl 5.11, вы можете использовать такие свойства, как \p{POSIX_Digit}, только для [0-9], \p{POSIX_Alpha} только для букв и \p{POSIX_Alnum} для обоих. Есть также \p{POSIX_Space} с этим выпуском или лучше, охватывающий символы 9-13 плюс 32 только , полностью игнорируя двадцать других пробельных символов, которые появятся позже.

До этого вы все еще можете ограничить свои совпадения диапазоном ASCII, используя предварительное утверждение, которое ограничивает совпадение только ASCII, используя /(?=\p{ASCII})[\p{Alpha}\p{Digit}]/, хотя ограничение символов до 7 битов ужасно в прошлом тысячелетии.

Я бы, вероятно, позволил им использовать римские цифры, но не экзотические диакритические знаки, поэтому просто использовал бы /[\p{Letter}\p{Digit}]/, который вы можете сократить до /[\pL\d]/, если хотите.

Теперь вы добавляете пробел к этому с \s или чуть более широким \p{Space}, давая /[\p{Letter}\p{Digit}\p{Space}]/. Я бы тоже оставил это в этой форме, потому что я думаю, что яснее, что вы имеете в виду.

Чтобы отрицать это, вы можете подумать о добавлении префикса к !, но это не совсем так, поскольку пустая строка будет соответствовать. Таким образом, вы должны поставить каркас в начале класса символов, чтобы дополнить набор, сделав его /[^\p{Letter}\p{Digit}\p{Space}]/.

Вы можете , а не , просто переключить смысл \p в \P вместо того, как вы могли бы с одним свойством, поскольку /[\P{Letter}\P{Digit}\P{Space}]/ получит буквенные символы, которые не являются цифрами, (пробел) символы, которые не являются цифрами, цифры, которые не являются пробелами, и т. д.

Однако все еще нет причин использовать /i.

2 голосов
/ 20 октября 2010
[^\p{Alnum}\d ] # NOT alnum or space
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...