Sie könnten eine einzelne Regex erstellen, die funktionieren würde, WENN die Argumente keine Regex-Ausdrücke wären.
Die Idee ist folgende Reihenfolge:
- ein Wechsel
(one|two|...)
- gefolgt von nicht-gierig allem
(.*?)
- durch eine negative Vorschau gefolgt von dem, was angepasst Wechsel # 1
(?!\1)
- gefolgt von der wiederholte Wechsel
(one|two|...)
- gefolgt von nicht-gierigen irgendetwas
(.*?)
- durch eine negative Vorschau von einem Wechsel gefolgt von dem, was entweder des letzten Wechsel angepasst
(?!\1|\2)
Wiederholen Sie 4-6, bis wir ein Spiel für alle Laufzeiten.
So ist der Code, der diese Konstrukte ist:
sub create_compound_match {
my @args = @_;
my $arg_limit = $#args;
my $expr = join('|', map { lc; } @args);
my $neg_lookahead = join('|', map { "\\$_" } 1..$arg_limit);
my $test = join('.*?'
, "($expr)"
, (map { '(?!'
. substr($neg_lookahead, 0, 3 * $_ - 1)
. ")($expr)"
} 1..$arg_limit
)
);
return qr/$test/i;
}
, die auf diese Art und Weise getestet werden würde:
my $test = create_compound_match(@ARGV);
print foreach grep { /$test/i } <$fh>;
Dies ist jedoch die Fähigkeit von @ARGV
in reguläre Ausdrücke auf der Kommandozeile übergeben fehlt könnte gleich qw sein, und die generierte Regex würde glücklicherweise mit 'aa aaa aaaa' übereinstimmen, ohne die Übereinstimmung von b*
zu erfordern, weil "aa"! = "a", so dass das negative Lookahead erfüllt ist.
Was versuchen Sie zu erreichen? Was ist der Sinn dieses Codes? –
@brian: Es sieht so aus, als wolle er es auswerten. – Axeman
Ja, aber warum? Zu fragen, wie man etwas macht, ist oft die falsche Frage. Ich möchte wissen, was er zu erreichen versucht. –