Сопоставьте все, кроме указанных строк

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

red|green|blue

Есть ли простой способ сделать его совпадающим со всеми кроме несколькими указанными строками?

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

(?!red|green|blue)

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

Ответ 3

Совпадение всего, кроме заданных строк

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

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

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

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

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

Ответ 4

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

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

Описание:

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

Пример:

redwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhitered

Будет:

whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite

Проверьте это: regex101.com

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

Ответ 5

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

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

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

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

Ответ 6

Все кроме слова "красный"

var href = '(text-1) (red) (text-3) (text-4) (text-5)';

var test = href.replace(/\((\b(?!red\b)[\s\S]*?)\)/g, testF); 

function testF(match, p1, p2, offset, str_full) {
  p1 = "-"+p1+"-";
  return p1;
}

console.log(test);