Легкая оптимизация регулярного выражения

У меня есть регулярное выражение, которое был результатом компьютерной программы. В нем есть такие вещи, как

(((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. Во-вторых, даже после того, как я это сделаю, выражение будет подавлено.


Примечание: я пометил этот [обычный язык] в дополнение к [регулярному выражению], потому что в регулярном выражении используются только конкатенация, чередование и звездочка Клини, поэтому факт регулярный.

6
задан Charles 19 August 2011 в 17:51
поделиться