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


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

\w but without _

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

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

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

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

Author: Joseph Silber, 2013-02-13

7 answers

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

[^\W_]

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

 28
Author: protist, 2013-02-13 16:49:41

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

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

 7
Author: Bergi, 2013-02-13 16:43:56

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

[a-zA-Z0-9.-]

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

Короче может быть лучше, но только если вы точно знаете, что это означает.

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

 3
Author: nhahtdh, 2013-02-13 16:40:36

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

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

Так что я думаю, что ты хочешь [a-zA-Z0-9.-]

 2
Author: Kent, 2013-02-13 16:42:40

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

\w(?<!_)
 1
Author: Zero Piraeus, 2013-02-13 16:41:01

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

 1
Author: Zoltán Tamási, 2013-02-13 16:43:10

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

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

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

 0
Author: MrD, 2017-12-18 13:59:35