Я знаю, что следующее регулярное выражение будет соответствовать «красным», «зеленым» или «синим».Сопоставьте все, кроме указанных строк
red|green|blue
Есть ли простой способ сделать это сопрягать все кроме нескольких заданных строк?
Я знаю, что следующее регулярное выражение будет соответствовать «красным», «зеленым» или «синим».Сопоставьте все, кроме указанных строк
red|green|blue
Есть ли простой способ сделать это сопрягать все кроме нескольких заданных строк?
Зависит от языка, но, как правило, отрицательные-утверждения можно поставить в как так:
(?!red|green|blue)
(Спасибо за синтаксической исправления, выше действительна Java и Perl, YMMV)
Вы имеете в виду '(?! Red | green | blue)'. –
@caskey, Полный ответ - это комбинация моей и вашей. Если вы хотите объединить их вместе, я удалю свою. –
Этот ответ был бы намного полезнее, если вы немного объяснили это. Например: что делать?? а также "!" имею в виду? Зачем вам нужны группы захвата? – Lii
Если вы хотите, чтобы строка не была ни красной, ни зеленой, ни синей, ответ caskey - это. Однако часто требуется, чтобы линия не содержала красный, зеленый или синий в любом месте. Для этого, якорь регулярное выражение с ^
и включают .*
в отрицательного предпросмотра:
^(?!.*(red|green|blue))
Кроме того, предположим, что вы хотите строки, содержащие слово «двигатель», но без каких-либо из этих цветов:
^(?!.*(red|green|blue)).*engine
можно подумать, вы можете профакторизовать .*
к голове регулярного выражения:
^.*(?!red|green|blue)engine # Does not work
но вы можете не. Для этого вам нужно иметь оба экземпляра .*
.
@ Russ Спасибо за указание на ошибку. Я отредактировал ответ. Я исправил его с помощью некоторых скобок, но ваше исправление с дополнительными копиями '. *' Тоже хорошо. Тем не менее, я не уверен, что трейлинг. * Необходимо. –
трейлинг. * Не требуется, если вы просто хотите логическую проверку для соответствия. Если вы действительно хотите, чтобы полный текст соответствовал вам, вам это нужно. Также ... ваше новое решение красивое и чистое. Благодаря! – Russ
У меня был тот же вопрос, предлагаемые решения почти работали, но у них была проблема. В конце используемое мной регулярное выражение:
Я тестировал его в Javascript и .NET.
. * Не следует размещать внутри негативного вида:^(?!. * Red | green | blue), иначе это приведет к тому, что первый элемент будет отличаться от остальных (т.е. «anotherred» не будет будет соответствовать, пока «другой зеленый» будет)
Вам не нужен негативный взгляд.Существует рабочий пример:
/([\s\S]*?)(red|green|blue)/g
Описание:
[\s\S]
- любой символ*
- матч от 0 до неограниченного от предыдущей группы?
- матча как можно меньше(red|green|blue)
- соответствует одному из этих словg
- повторение картиныПример:
redwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhitered
Будет:
whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite
Попробуй: regex101.com
займет 1155 шагов, но если кто-то может импровизация я буду признателен.
Этот ответ был бы лучше, если бы вы объяснили, как работает паттен. – Lii
@Lii Я не знаю, что в этом шаблоне нужно объяснить. Это основное регулярное выражение. – hlcs
Вы можете резко уменьшить количество шагов путем замены [\ s \ S] на точку. Я был очень смущен, почему, кажется, каждый другой пример фиксирует каждое слово в отдельности. Этот способ имеет несколько более регулярные шаги, но требует гораздо меньшей постобработки. – Zatronium
Если вы хотите, чтобы соответствовать всей строке, где вы хотите, чтобы соответствовать все, кроме определенных строк, которые вы можете сделать это следующим образом:
^(?!(red|green|blue)$).*$
Это говорит о том, начале совпадение с начала строки, где она не может начинаться и заканчиваться красным, зеленым или синим цветом и соответствовать чему-либо еще до конца строки.
Вы можете попробовать его здесь: https://regex101.com/r/rMbYHz/2
Обратите внимание, что это работает только с регулярными выражениями двигателей, которые поддерживают negative lookahead.
Не все ароматы регулярных выражений могут это сделать. В какой среде вы работаете? Ява? Perl? .СЕТЬ? Некоторая библиотека регулярных выражений C/C++? СУРБД? – FrustratedWithFormsDesigner
Вы не говорите, для чего хотите, но можете просто инвертировать смысл операции «матч». Это не поможет вам, если вы пытаетесь выполнить извлечение на несоответствующих деталях, но чтобы проверить, нет ли исключенной строки, она будет работать: 'if (! S.match (/ red | green | blue /)) ... 'Примечание: я знаю, что OP не указывает, какой язык/фреймворк, поэтому предыдущий должен рассматриваться как общий пример, а не предписывающий. – tvanfosson