Regex - как сопоставить все, кроме определенного шаблона

Как написать регулярное выражение для соответствия любой строке, которая не соответствует определенному шаблону? Я столкнулся с ситуацией, когда я должен соответствовать шаблону (A и ~B).

8 ответов


вы можете использовать упреждающее утверждение:

(?!999)\d{3}

этот пример соответствует три цифры 999.


но если у вас нет реализации регулярного выражения с этой функцией (см. сравнение вкусов регулярного выражения), вам, вероятно, придется самостоятельно создать регулярное выражение с основными функциями.

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

[0-8]\d\d|\d[0-8]\d|\d\d[0-8]

Это также соответствует любой последовательности из трех цифр, которая не 999.


Если вы хотите сопоставить слово A в строке и не соответствовать слову B. Например: Если у вас есть текст:

1. I have a two pets - dog and a cat
2. I have a pet - dog

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

^(?=.*?\bdog\b)((?!cat).)*$

он найдет только вторую строку:

2. I have a pet - dog

матч против шаблона и использовать язык хоста, чтобы инвертировать логический результат матча. Это будет гораздо более разборчивым и ремонтопригодным.


нет, воскрешая этот древний вопрос, потому что у него было простое решение, которое не упоминалось. (Нашел свой вопрос, делая некоторые исследования для regex bounty quest.)

я столкнулся с ситуацией, когда я должен соответствовать (A и ~B) узор.

основные regex для это пугающе просто: B|(A)

вы просто игнорируете общие матчи и изучаете захваты группы 1, которые будут содержать А.

пример (со всеми оговорками о разборе html в регулярном выражении): a-цифры, B-цифры в <a tag

регулярное выражение: <a.*?<\/a>|(\d+)

демо (посмотрите на Группу 1 в нижней правой панели)

ссылка

как соответствовать шаблону, за исключением ситуаций s1, s2, s3

как соответствовать шаблону, если...


дополнение регулярного языка также является регулярным языком, но для его построения вам нужно построить DFA для обычного языка и сделайте любое допустимое изменение состояния ошибкой. См.этой для примера. Что страница не говорит, так это то, что она преобразована /(ac|bd)/ на /(a[^c]?|b[^d]?|[^ab])/. Преобразование из DFA обратно в регулярное выражение не является тривиальным. Проще, если вы можете использовать регулярное выражение без изменений и изменить семантику в коде, например предлагал раньше.


pattern-re

str.split(/re/g) 

вернет все, кроме шаблона.

тест здесь


мой ответ здесь может решить вашу проблему:

https://stackoverflow.com/a/27967674/543814

  • вместо замены вы бы использовали Match.
  • вместо группы , вы бы прочитали group .
  • группа был сделан не-захват там, которого вы избежали бы.

пример:

Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");

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


(B)|(A)

затем используйте то, что захватывает группа 2...