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

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

Ответы [ 8 ]

189 голосов
/ 04 марта 2009

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

(?!999)\d{3}

Этот пример соответствует трем цифрам, отличным от 999.


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

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

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

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

28 голосов
/ 21 февраля 2013

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

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

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

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

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

2. I have a pet - dog
15 голосов
/ 04 марта 2009

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

7 голосов
/ 14 мая 2014

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

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

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

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

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

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

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

Ссылка

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

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

4 голосов
/ 04 марта 2009

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

1 голос
/ 05 марта 2009

шаблон - повторно

str.split(/re/g) 

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

Тест здесь

0 голосов
/ 15 января 2015

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

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

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

Пример:

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

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

0 голосов
/ 05 марта 2009
(B)|(A)

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

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