Какой оператор регулярного выражения означает "Не соответствует этому символу"?

89

*, ?, +все символы означают соответствие этому символу. Какой символ означает «не соответствует»? Примеры помогут.

Нажмите Голосовать за
источник
Решение, связанное с несоответствием слова - см. Здесь stackoverflow.com/questions/406230
null

Ответы:

88

Вы можете использовать классы инвертированных символов, чтобы исключить определенные символы: например, [^abcde]будет соответствовать чему угодно, кроме символов a, b, c, d, e.

Вместо того, чтобы указывать все символы буквально, вы можете использовать сокращения внутри классов символов: [\w](нижний регистр) будет соответствовать любому «словесному символу» (буква, числа и подчеркивание), [\W](верхний регистр) будет соответствовать чему угодно, кроме словесных символов; аналогично, [\d]будет соответствовать цифрам 0-9, тогда как [\D]соответствует чему угодно, кроме цифр 0-9, и так далее.

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

Паоло Стефан
источник
80

Есть два способа сказать «не соответствует»: диапазоны символов и отрицательный просмотр вперед / назад нулевой ширины.

Прежний: не совпадают a, b, cили 0:[^a-c0]

Последний: соответствует любой трехбуквенной строке, кроме fooи bar:

(?!foo|bar).{3}

или

.{3}(?<!foo|bar)

Кроме того , коррекция для вас: *, ?и на +самом деле не соответствует ничего. Они являются операторами повторения и всегда следуют за оператором сопоставления. Таким образом, a+средства соответствуют одному или нескольким из a, [a-c0]+значит соответствовать одному или более a, b, cили 0, в то время как [^a-c0]+будет соответствовать одному или более ничего , что не было a, b, cили 0.

Амадан
источник
^((?!foo).)+$Соответствует любой строке, не содержащей foo regex101.com/r/z6a65l/4
Леви Багули
48

[^] (внутри [] ) - отрицание в регулярном выражении, тогда ^как «начало строки»

[^a-z] соответствует любому одиночному символу, который не от "a" до "z"

^[a-z] означает, что строка начинается с «а» до «я»

Справка

diEcho
источник
8

^ используется в начале диапазона символов или в утверждениях отрицательного просмотра вперед / назад.

>>> re.match('[^f]', 'foo')
>>> re.match('[^f]', 'bar')
<_sre.SRE_Match object at 0x7f8b102ad6b0>
>>> re.match('(?!foo)...', 'foo')
>>> re.match('(?!foo)...', 'bar')
<_sre.SRE_Match object at 0x7f8b0fe70780>
Игнасио Васкес-Абрамс
источник
Вы должны использовать ?!в последних двух примерах или можете просто использовать !отдельно? Что там делает ??
Нажмите Upvote
Python нужен для ?того, чтобы сказать, что это расширение. У других движков регулярных выражений могут быть свои правила.
Игнасио Васкес-Абрамс
@Click: Это довольно стандартно. regular-expressions.info/refadv.html , то же самое и в большинстве руководств к движку regexp.
Амадан