File: //usr/share/modsecurity-crs/util/regexp-assemble/regexp-assemble-v2.pl
#!/usr/bin/perl
#
# Create one regexp from a set of regexps.
# Regexps can be submitted via standard input, one per line.
#
# Requires Regexp::Assemble Perl module.
# To install: cpan install Regexp::Assemble
#
# See: https://coreruleset.org/20190826/optimizing-regular-expressions/
#
use strict;
use Regexp::Assemble;
my $ra = Regexp::Assemble->new;
while (<>)
{
# Handle possessive qualifiers
# https://rt.cpan.org/Public/Bug/Display.html?id=50228#txn-672717
my $arr = $ra->lexstr($_);
for (my $n = 0; $n < $#$arr - 1; ++$n)
{
if ($arr->[$n] =~ /\+$/ and $arr->[$n + 1] eq '+') {
$arr->[$n] .= splice(@$arr, $n + 1, 1);
}
}
$ra->insert(@$arr);
}
print $ra->as_string() . "\n";