Для большинства целей достаточно [^\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
.