Как преобразовать PCRE в POSIX RE? - PullRequest
12 голосов
/ 15 мая 2010

Этот интересный вопрос Regex для сопоставления с чем угодно (включая пустую строку), за исключением конкретной заданной строки , касающейся того, как сделать отрицательный прогноз в MySQL. Плакат хотел получить эффект

Kansas(?! State)

, поскольку MySQL не реализует прогнозные утверждения, количество ответов составило эквивалент

Kansas($|[^ ]| ($|[^S])| S($|[^t])| St($|[^a])| Sta($|[^t])| Stat($|[^e]))

Автор указывал, что это PITA для потенциально большого количества выражений.

Существует ли сценарий / утилита / режим PCRE (или какой-либо другой пакет), который преобразует PCRE (если возможно) в эквивалентное регулярное выражение, не использующее шикарные функции Perl? Я полностью осознаю, что некоторые регулярные выражения в стиле Perl нельзя описать как обычные регулярные выражения, поэтому я, конечно, не ожидал бы, что инструмент сделает невозможное!

1 Ответ

2 голосов
/ 04 июня 2010

Ты не хочешь этого делать. На самом деле не так сложно перевести расширенные функции в базовые функции - это просто еще одна разновидность компилятора, а авторы компиляторов - довольно умные люди, - но большинство вещей, которые решают эти привлекательные функции, (а) невозможно сделать с стандартное регулярное выражение, потому что они распознают нерегулярные языки, поэтому вам придется их аппроксимировать, чтобы, по крайней мере, они работали для текста ограниченной длины или (б) возможно, но только с регулярным выражением экспоненциального размера. И «экспоненциальный» - это общеизвестный термин «не ходи туда». Вы будете забиваться ошибками OutOfMemory и, казалось бы, бесконечными циклами, если попытаетесь использовать экспоненциальное решение для всего, что вы действительно хотите обработать.

Другими словами, оставь все надежды, входящие сюда. Практически всегда лучше позволить регулярному выражению делать то, что у него хорошо получается, а делать все остальное с помощью других инструментов. Даже такая простая вещь, как инвертирование регулярного выражения, гораздо проще решить с помощью исходного регулярного выражения в сочетании с оператором отрицания, чем с чудовищностью, которая может возникнуть в результате точного инвертора регулярного выражения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...