Ну, вы можете теоретически построить регулярное выражение, которое соответствует противоположному. Но для более длинных строк это регулярное выражение станет большим. То, как вы будете делать это систематически (очень упрощенно):
- Преобразование регулярного выражения в детерминированный конечный автомат
- Преобразовать конечные условия автомата, чтобы он принимал перевернутый регулярный язык
- Преобразуйте автомат обратно в регулярное выражение, последовательно удаляя узлы из автомата, сохраняя при этом его поведение. Удаление одного узла потребует объединения двух или более регулярных выражений, чтобы они учитывали удаленный узел.
- Если у вас есть один начальный узел и один конечный узел, вы закончили: регулярное выражение, помечающее ребро между ними, является искомым искомым регулярным выражением.
Практически, вы можете просто найти нужную вам строку , а не , и инвертировать результат. Вот как это будет выглядеть в awk:
echo azyxbc | awk '{ exit ($0 !~ /a.*b.*c/); }' && echo matched
Если вас это интересует, я рекомендую книгу Майкла Сипсера " Введение в теорию вычислений ".