Регулярное выражение - как сопоставить все, кроме определенного шаблона
Вопрос
Как мне написать регулярное выражение, соответствующее любой строке, которая не соответствует определенному шаблону?Я столкнулся с ситуацией, когда мне нужно сопоставить шаблон (A и ~ B).
Решение
Вы можете использовать предварительное утверждение:
(?!999)\d{3}
Этот пример соответствует трем цифрам, кроме 999
.
Но если у вас нет реализации регулярного выражения с этой функцией (см. Сравнение разновидностей регулярных выражений ), вам, вероятно, придется самостоятельно создавать регулярные выражения с базовыми функциями.
Совместимое регулярное выражение только с базовым синтаксисом будет:
[0-8]\d\d|\d[0-8]\d|\d\d[0-8]
Это также соответствует любой последовательности из трех цифр, которая не является <=>.
Другие советы
Если вы хотите сопоставить слово 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
Сопоставьте с шаблоном и используйте основной язык для инвертирования логического результата сопоставления. Это будет гораздо более разборчивым и понятным.
нет, воскрешение этого древнего вопроса, потому что у него было простое решение, которое не было упомянуто (Нашел ваш вопрос, когда проводил некоторые исследования для regex bounty quest .)
Я столкнулся с ситуацией, когда мне нужно сопоставить (A и ~ B) шаблон. р>
Основное регулярное выражение для этого пугающе просто: B|(A)
Вы просто игнорируете общие совпадения и изучаете захваты группы 1, которые будут содержать A.
Пример (со всеми заявлениями об отказе от синтаксического анализа html в регулярных выражениях): A - это цифры, B - это цифры внутри <a tag
Регулярное выражение: <a.*?<\/a>|(\d+)
Демонстрация (посмотрите на группу 1 в нижней правой панели)
Ссылка
Дополнение к обычному языку также является обычным языком, но для его создания необходимо создать DFA для обычного языка и внесите любое допустимое изменение состояния в ошибку. См. этот пример. На странице ничего не сказано о том, что она преобразована /(ac|bd)/
в /(a[^c]?|b[^d]?|[^ab])/
. Преобразование из DFA обратно в регулярное выражение не является тривиальным. Проще, если вы можете использовать регулярное выражение без изменений и изменить семантику в коде, как предложено ранее.
Мой ответ здесь также может решить вашу проблему:
https://stackoverflow.com/a/27967674/543814
- Вместо Замены вы бы использовали Match .
- Вместо группы
$1
, вы бы прочитали группу$2
. - Группа
$2
было сделано так, чтобы там не было захвата, чего вы бы избежали.
Пример:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
Первая группа захвата определяет шаблон, которого вы хотите избежать.Последняя группа захвата захватывает все остальное.Просто зачитайте эту группу, $2
.
(B)|(A)
затем используйте то, что захватывает группа 2 ...