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

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

Ответ 1

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

(?!999)\d{3}

В этом примере отображаются три цифры, отличные от 999.


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

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

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

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

Ответ 2

Если вы хотите совместить слово 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

Ответ 3

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

Ответ 4

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

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

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

Вы просто игнорируете общие совпадения и проверяете захват группы 1, который будет содержать A.

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

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

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

Ссылка

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

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

Ответ 5

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

Ответ 6

pattern - re

str.split(/re/g) 

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

Тест здесь

Ответ 7

(B)|(A)

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

Ответ 8

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

fooobar.com/info/10544/...

  • Вместо замены вы должны использовать Match.
  • Вместо группы $1 вы будете читать группу $2.
  • Группа $2 была сделана без захвата, чего вы бы избежали.

Пример:

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

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