Регулярное выражение - как сопоставить все, кроме определенного шаблона

StackOverflow https://stackoverflow.com/questions/611883

  •  03-07-2019
  •  | 
  •  

Вопрос

Как мне написать регулярное выражение, соответствующее любой строке, которая не соответствует определенному шаблону?Я столкнулся с ситуацией, когда мне нужно сопоставить шаблон (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 в нижней правой панели)

Ссылка

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

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

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

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

str.split(/re/g) 

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

Проверьте здесь

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

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

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

Пример:

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

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

(B)|(A)

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top