Регулярные выражения: как выразить w без подчеркивания


Есть ли краткий способ выразить:

w but without _

То есть "все символы, включенные в w, кроме _"

Я спрашиваю об этом, потому что ищу наиболее лаконичный способ выразить проверку доменных имен. Доменное имя может содержать строчные и прописные буквы, цифры, знаки точки и тире, но без подчеркивания. w включает все вышеперечисленное, плюс подчеркивание. Итак, есть ли способ "удалить" подчеркивание из w с помощью синтаксиса регулярных выражений?

Отредактировано: я спрашиваю о регулярных выражениях, используемых в PHP.

Заранее спасибо!

7 13

7 ответов:

Следующий класс символов (в Perl)

[^\W_]

\W это то же самое, что [^\w]

Вы могли бы использовать отрицательный lookahead: (?!_)\w

Тем не менее, я думаю, что запись [a-zA-Z0-9.-] более удобочитаема.

На всякий случай, как правило, мы будем использовать класс символов:

[a-zA-Z0-9.-]
"Фрагмент" регулярного выражения выше соответствует английскому алфавиту и цифрам, плюс период . и тире -. Он должен работать даже с самой базовой поддержкой регулярных выражений. Более короткий может быть лучше, но только если вы точно знаете, что он представляет. Я не знаю, какой язык вы используете. Во многих движках \w эквивалентно [a-zA-Z0-9_] (для некоторых требуется "режим ASCII"). Однако некоторые движки имеют Unicode поддержка регулярных выражений, и может расширить \w, чтобы соответствовать символам Юникода.

Если мое понимание верно \w означает [A-Za-z0-9_] знаки периода, тире не включены.

Информация: http://en.wikipedia.org/wiki/Regular_expression#POSIX_character_classes

Итак, я думаю, что вы хотите [a-zA-Z0-9.-]

Некоторые регулярные выражения имеют отрицательный синтаксис lookbehind, который вы можете использовать:

\w(?<!_)

Я бы начал с [ ^ _ ], а затем подумал о том, какие еще символы мне нужно отрицать. Если вам нужно отфильтровать ввод с клавиатуры, то достаточно просто перечислить все нежелательные символы.

Вы можете написать что-то вроде этого:

\([^\w]|_)\u

Если вы используете preg_filter с этой строкой, любой символ в \w (исключая _ подчеркивание) будет отфильтрован.