Сопоставьте все, кроме указанных строк
Я знаю, что следующее регулярное выражение будет соответствовать "красным", "зеленым" или "синим".
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);