Сопоставить все, кроме указанных строк - PullRequest
93 голосов
/ 08 марта 2010

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

red|green|blue

Существует ли простой способ сделать так, чтобы он соответствовал всем , за исключением нескольких указанных строк?

Ответы [ 6 ]

120 голосов
/ 08 марта 2010

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

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

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

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

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

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

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

37 голосов
/ 08 марта 2010

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

(?!red|green|blue)

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

19 голосов
/ 05 апреля 2017

Соответствует чему-либо, кроме заданных строк

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

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

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

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

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

17 голосов
/ 24 декабря 2015

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

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

Описание:

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

redwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhitered

будет:

whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite

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

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

10 голосов
/ 22 июля 2014

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

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

Я проверил это в Javascript и .NET.

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

0 голосов
/ 20 апреля 2019

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

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);

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

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

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

function testF(match, p1, p2, offset, str_full) {
  p1 = p1.replace(/red/g, '');
  p1 = "-"+p1+"-";
  return p1;
}

console.log(test);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...