2016-05-13 7 views
1

Ich habe ein Perl-Anwendung zusammenführen, die als Eingabe zwei regexp der bekommt.Wie perl regexp die in einem kombinierten Spiel

Ist es möglich, die regexp die in einem regulären Ausdruck in einer Art und Weise zu verbinden, dass ein Spiel nur dann, wenn die beiden regexp Bedingungen erfüllt passieren können, sind?

Beispiel:

pattern1 = "^.*$" 
pattern2 = "^abc$" 

Ergebnis sollte sein: "^abc$"

Ich weiß, es ist ein Modul „Regexp :: Assemble“ genannt, aber nur erlaubt mir, die regexp ist in einer Art und Weise zu kombinieren, dass beide die regexp Erstelle eine Übereinstimmung.

+0

' "^. * $"' ........... –

+0

Es ist nur ein Beispiel – Silence

Antwort

3

Sie können nicht sie zu einem einzigen Regex verschmelzen - das ist eine viel kompliziertere Sache, als Sie sich vorstellen können. (Außerhalb relativ trivialer Fälle). regex ist eine Programmiersprache, und etwas zu bekommen, um es für Sie zu schreiben, ist eine nicht-triviale Art von Aufgabe.

Aber man kann ganz praktisch mehrere reguläre Ausdrücke testen.

#!/usr/bin/env perl 
use strict; 
use warnings; 

my @conditions = (qr/^.*$/, qr/[A-Z]+/, qr/123/,); 

LINE: while (<DATA>) { 
    foreach my $regex (@conditions) { 
     next LINE unless m/$regex/; 
    } 
    print; 
} 

__DATA__ 
shouldn't match, non number 
1234567 
test123 
Test123 

Aus Effizienzgründen können Sie die Regexe auch so bestellen, dass die Fehler am häufigsten zuerst auftreten.

1

Es ist möglich, aber mit einer Einschränkung. Alles, was Sie tun müssen, ist, wie dies in einer vorwärtsgerichteten Behauptung eines des Musters einschließen:

(?=pattern1)pattern2 

, trägt das erste Muster des Dies sollte auch dann, wenn die Muster haben Inline-Modifikatoren ((?i) oder ähnliches) arbeitet Modifikatoren soll nicht über zum zweiten Muster.

Das einzige Problem mit dieser Lösung, die ich kenne, sind Rückverweise (\1, \2, etc). Wenn in Muster1 Sammlungsgruppen vorhanden sind, beziehen sich alle Rückwärtsreferenzen in Muster2 auf die falsche Gruppe. Zum Beispiel:

pattern1 = "(a)b." 
pattern2 = "a(b)\1" 
text = "abb" 

Beide Muster würden abb übereinstimmen, aber die kombinierte Muster (?=(a)b.)a(b)\1 würde aba nur entsprechen.

Verwandte Themen