Отрицание регулярного выражения

Я не уверен, как это называется: отрицание, дополнение или инверсия. Концепция заключается в следующем. Например, имея алфавит "AB"

R = 'a'
!R = the regexp that matche everyhting exept what R matches

В этом простом примере это должно быть

!R = 'b*|[ab][ab]+'

Как называется такое регулярное выражение? Я помню из моих исследований, что есть способ рассчитать это, но это что-то сложное и, как правило, слишком сложно сделать вручную. Есть ли хороший онлайн-инструмент (или обычное программное обеспечение) для этого?

2 ответа

Ответ jbo5112 дает хорошую практическую помощь. Однако с теоретической точки зрения: регулярное выражение соответствует регулярному языку, поэтому искомый вами термин - это дополнение.

Чтобы дополнить регулярное выражение:

  1. Конвертировать в эквивалент NFA. Это хорошо известный и определенный процесс.
  2. Преобразование NFA в DFA через конструкцию powerset
  3. Дополните DFA, заставив принимать состояния не принимать и наоборот.
  4. Преобразуйте DFA в регулярное выражение.

Теперь у вас есть дополнение оригинального регулярного выражения!

Если все, что вы делаете, - это поиск, то в некоторых программах / языках для регулярных выражений есть способ отрицать встроенное совпадение. Например, с помощью grep вы можете использовать опцию -v, чтобы получить строки, которые не совпадают, и варианты SQL, которые я видел, позволяют вам использовать квалификатор not, чтобы отрицать совпадение.

Другой вариант, который поддерживают некоторые / большинство / все диалекты регулярных выражений, - это использовать "негативный взгляд". Возможно, вам придется поискать свой конкретный синтаксис, но это интересный инструмент, о котором стоит прочитать. Вообще то как то так: если R='<regex>', затем Negative_of_R='(?!<regex>)', К сожалению, это может варьироваться в зависимости от особенностей вашего языка (например, vim использует \(<regex>\)\@!).

Предостережение: если вы не будете осторожны, регулярное выражение с отрицанием будет соответствовать больше, чем вы ожидаете. Если у вас есть текст This doesn't match 'mystring'. и искать (?!mystring)тогда он будет соответствовать всему, кроме "m" в mystring.

Другие вопросы по тегам