У меня есть регулярное выражение, которое был результатом компьютерной программы. В нем есть такие вещи, как
(((2)|(9)))*
, которые человек, несомненно, запишет как
[29]*
. Поэтому мне нужна программа, которая может выполнять простые преобразования, которые делают регулярное выражение более читабельным. До сих пор я использовал быстрый сценарий
$r =~ s/\(([0-9])\)/$1/g;
$r =~ s/\(([0-9])\|([0-9])\)/[$1$2]/g;
$r =~ s/\(([0-9]|\[[0-9]+\])\)\*/$1*/g;
$r =~ s/\((\[[0-9]+\]\*)\)/$1/g;
$r =~ s/\|\(([^()]+)\)\|/|$1|/g;
, который уменьшает длину, но результат все еще содержит такие части, как
(ba*b)|ba*c|ca*b|ca*c
, которые следует упростить до
[bc]a*[bc]
. Я поискал CPAN и нашел Regexp :: List, Regexp :: Собрать и Regexp :: Optimizer. Первые два не подходят, а с третьим есть проблемы. Во-первых, он не пройдет свои тесты, поэтому я не смогу использовать его, пока не принудительно установлю Regexp :: Optimizer
в cpan. Во-вторых, даже после того, как я это сделаю, выражение будет подавлено.
Примечание: я пометил этот [обычный язык] в дополнение к [регулярному выражению], потому что в регулярном выражении используются только конкатенация, чередование и звездочка Клини, поэтому факт регулярный.