Прежде всего, я полагаю, что вы имеете в виду дополнение регулярного выражения, а не обратное.Обратное регулярное выражение не имеет большого смысла;но если рассматривать ее как функцию, я полагаю, вы могли бы сказать, что обратная сторона сопоставителя - это генератор, который генерирует все совпадающие строки - или что-то в этом роде.С другой стороны, дополнение языка - это все эти строки , а не в исходном языке.
Далее, здесь необходимо рассмотреть два представления:
Принципиально
Дополнение к обычному языку является регулярным.Это означает, что можно сгенерировать принимающий DFA для дополнения (и на самом деле сделать это очень просто: просто поменять набор неприемлемых состояний на набор принимающих состояний).Любой такой DFA может быть выражен как регулярное выражение - поэтому в принципе вы можете сделать такое регулярное выражение.
См. Статью в Википедии о Regular Languages в качестве отправной точки.
Практически
Типичный perl-совместимый синтаксис регулярных выражений, используемый в настоящее время в большинстве современных языков, не имеет оператора дополнения.Для регулярного выражения complete вы можете получить что-то похожее, используя оператор отрицательного просмотра: (?!X)
будет точно соответствовать строке, а X
- нет.Однако это плохая замена оператора дополнения, поскольку вы не сможете использовать его как часть большего регулярного выражения обычным способом;это регулярное выражение не "потребляет" входные данные, что означает, что он ведет себя по-разному в сочетании с другими операторами.
Например, если вы сопоставите числовые строки как [0-9]*
, чтобы соответствовать всей строке, которую вы добавляете ^
и добавьте $
, но чтобы использовать эту технику для поиска дополнения, вам нужно написать ^(?!^[0-9]*$).*$
- и обычная конкатенация такого отрицательного регулярного выражения, насколько я могу судить, не может быть отменена.
По иронии судьбы, практическое воплощение регулярных выражений теоретически более мощное из-за обратных ссылок, но практически менее гибкое, так как язык не может достаточно легко выразить операции дополнения и пересечения.