Я знаю, что следующее регулярное выражение будет соответствовать "красным", "зеленым" или "синим".
red|green|blue
Есть ли простой способ сделать его совпадающим со всеми кроме несколькими указанными строками?
Я знаю, что следующее регулярное выражение будет соответствовать "красным", "зеленым" или "синим".
red|green|blue
Есть ли простой способ сделать его совпадающим со всеми кроме несколькими указанными строками?
Если вы хотите убедиться, что строка не является ни красной, ни зеленой, ни синей, caskey отвечает. Однако часто требуется, чтобы линия не содержала красный, зеленый или синий в любом месте. Для этого привяжите регулярное выражение с помощью ^
и включите .*
в отрицательный просмотр:
^(?!.*(red|green|blue))
Кроме того, предположим, что вам нужны строки, содержащие слово "движок", но без каких-либо из этих цветов:
^(?!.*(red|green|blue)).*engine
Вы можете подумать, что вы можете указать .*
в голову регулярного выражения:
^.*(?!red|green|blue)engine # Does not work
но вы не можете. Для этого вам нужно иметь оба экземпляра .*
.
Зависит от языка, но обычно есть отрицательные утверждения, которые вы можете добавить так:
(?!red|green|blue)
(Спасибо за синтаксическое исправление, выше допустимо Java и Perl, YMMV)
Если вы хотите сопоставить всю строку, где вы хотите сопоставить все, кроме определенных строк, вы можете сделать это следующим образом:
^(?!(red|green|blue)$).*$
Это говорит о том, что начинать сопоставление следует с начала строки, где оно не может начинаться и заканчиваться красным, зеленым или синим, и сопоставлять что-либо еще до конца строки.
Вы можете попробовать это здесь: https://regex101.com/r/rMbYHz/2
Обратите внимание, что это работает только с движками регулярных выражений, которые поддерживают отрицательный прогноз.
Вам не нужен негативный взгляд. Существует рабочий пример:
/([\s\S]*?)(red|green|blue)/g
Описание:
[\s\S]
- сопоставить любой символ*
- совпадение от 0 до неограниченного от предыдущей группы?
- соответствовать как можно меньше(red|green|blue)
- соответствует одному из этих словg
- повторить шаблонПример:
redwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhitered
Будет:
whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite
Проверьте это: regex101.com
Принимает 1155 шагов, но если кто-то может улучшить, я буду признателен.
У меня был тот же вопрос, предлагаемые решения почти работали, но у них была проблема. В конечном итоге я использую регулярное выражение:
^(?!red|green|blue).*
Я тестировал его в Javascript и .NET.
. * не следует размещать внутри негативного вида: ^ (?!. * red | green | blue), иначе он будет отличаться от остальных элементов (т.е. "otherred" не будет совпадающий, когда "другой зеленый" будет)
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);