2010-03-08 2 views
60

Я знаю, что следующее регулярное выражение будет соответствовать «красным», «зеленым» или «синим».Сопоставьте все, кроме указанных строк

red|green|blue 

Есть ли простой способ сделать это сопрягать все кроме нескольких заданных строк?

+1

Не все ароматы регулярных выражений могут это сделать. В какой среде вы работаете? Ява? Perl? .СЕТЬ? Некоторая библиотека регулярных выражений C/C++? СУРБД? – FrustratedWithFormsDesigner

+5

Вы не говорите, для чего хотите, но можете просто инвертировать смысл операции «матч». Это не поможет вам, если вы пытаетесь выполнить извлечение на несоответствующих деталях, но чтобы проверить, нет ли исключенной строки, она будет работать: 'if (! S.match (/ red | green | blue /)) ... 'Примечание: я знаю, что OP не указывает, какой язык/фреймворк, поэтому предыдущий должен рассматриваться как общий пример, а не предписывающий. – tvanfosson

ответ

28

Зависит от языка, но, как правило, отрицательные-утверждения можно поставить в как так:

(?!red|green|blue) 

(Спасибо за синтаксической исправления, выше действительна Java и Perl, YMMV)

+2

Вы имеете в виду '(?! Red | green | blue)'. –

+1

@caskey, Полный ответ - это комбинация моей и вашей. Если вы хотите объединить их вместе, я удалю свою. –

+4

Этот ответ был бы намного полезнее, если вы немного объяснили это. Например: что делать?? а также "!" имею в виду? Зачем вам нужны группы захвата? – Lii

87

Если вы хотите, чтобы строка не была ни красной, ни зеленой, ни синей, ответ caskey - это. Однако часто требуется, чтобы линия не содержала красный, зеленый или синий в любом месте. Для этого, якорь регулярное выражение с ^ и включают .* в отрицательного предпросмотра:

^(?!.*(red|green|blue)) 

Кроме того, предположим, что вы хотите строки, содержащие слово «двигатель», но без каких-либо из этих цветов:

^(?!.*(red|green|blue)).*engine 

можно подумать, вы можете профакторизовать .* к голове регулярного выражения:

^.*(?!red|green|blue)engine  # Does not work 

но вы можете не. Для этого вам нужно иметь оба экземпляра .*.

+1

@ Russ Спасибо за указание на ошибку. Я отредактировал ответ. Я исправил его с помощью некоторых скобок, но ваше исправление с дополнительными копиями '. *' Тоже хорошо. Тем не менее, я не уверен, что трейлинг. * Необходимо. –

+0

трейлинг. * Не требуется, если вы просто хотите логическую проверку для соответствия. Если вы действительно хотите, чтобы полный текст соответствовал вам, вам это нужно. Также ... ваше новое решение красивое и чистое. Благодаря! – Russ

5

У меня был тот же вопрос, предлагаемые решения почти работали, но у них была проблема. В конце используемое мной регулярное выражение:

Я тестировал его в Javascript и .NET.

. * Не следует размещать внутри негативного вида:^(?!. * Red | green | blue), иначе это приведет к тому, что первый элемент будет отличаться от остальных (т.е. «anotherred» не будет будет соответствовать, пока «другой зеленый» будет)

15

Вам не нужен негативный взгляд.Существует рабочий пример:

/([\s\S]*?)(red|green|blue)/g 

Описание:

  • [\s\S] - любой символ
  • * - матч от 0 до неограниченного от предыдущей группы
  • ? - матча как можно меньше
  • (red|green|blue) - соответствует одному из этих слов
  • g - повторение картины

Пример:

redwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhitered

Будет:

whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite

Попробуй: regex101.com

займет 1155 шагов, но если кто-то может импровизация я буду признателен.

+1

Этот ответ был бы лучше, если бы вы объяснили, как работает паттен. – Lii

+0

@Lii Я не знаю, что в этом шаблоне нужно объяснить. Это основное регулярное выражение. – hlcs

+4

Вы можете резко уменьшить количество шагов путем замены [\ s \ S] на точку. Я был очень смущен, почему, кажется, каждый другой пример фиксирует каждое слово в отдельности. Этот способ имеет несколько более регулярные шаги, но требует гораздо меньшей постобработки. – Zatronium

5

Matching Anything но заданные строки

Если вы хотите, чтобы соответствовать всей строке, где вы хотите, чтобы соответствовать все, кроме определенных строк, которые вы можете сделать это следующим образом:

^(?!(red|green|blue)$).*$

Это говорит о том, начале совпадение с начала строки, где она не может начинаться и заканчиваться красным, зеленым или синим цветом и соответствовать чему-либо еще до конца строки.

Вы можете попробовать его здесь: https://regex101.com/r/rMbYHz/2

Обратите внимание, что это работает только с регулярными выражениями двигателей, которые поддерживают negative lookahead.

Смежные вопросы