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

Есть ли сжатый способ выражения:

\w but without _

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

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

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

Спасибо заранее!

Ответ 1

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

[^\W_]

\W совпадает с [^\w]

Ответ 2

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

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

Ответ 3

Чтобы быть в безопасности, обычно мы будем использовать класс символов:

[a-zA-Z0-9.-]

"фрагмент" регулярного выражения соответствует английскому алфавиту и цифрам плюс период . и тире -. Он должен работать даже с самой базовой поддержкой регулярных выражений.

Более короткий может быть лучше, но только если вы точно знаете, что он представляет.

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

Ответ 5

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

\w(?<!_)

Ответ 6

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

Ответ 7

Вы можете написать примерно следующее:

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

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