我有一个正则表达式,它是计算机程序的输出。它有类似的东西
(((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::Assemble 和 Regexp::Optimizer。前两个不适用,第三个有问题。首先,它不会通过测试,所以除非我force install Regexp::Optimizer
在 cpan 中,否则我不能使用它。其次,即使我这样做了,它也会让表情窒息。
注意:除了 [regex] 之外,我还标记了此 [regular-language],因为 regexp 仅使用串联、交替和 Kleene 星号,因此它实际上是常规的。