Thread Suchstrings kombinieren (8 answers)
Opened by hugenyn at 2011-03-01 11:37

clms
 2011-03-01 12:16
#146137 #146137
User since
2010-08-29
373 Artikel
BenutzerIn
[default_avatar]
Code: (dl )
1
2
my $code1 = "\(C\.\*\)\{2\}";
my $code2 = " $best \| $best\[M\] ";

würde ich umschreiben in
Code (perl): (dl )
1
2
my $code1 = qr"(C.*){2}";
my $code2 = qr" $best | ${best}M ";

Da Du die Variablen wohl nur als Regex verwendest.
(Und die Escapoes mit '\' sind eh überflüssig).

2011-03-01T10:37:03 hugenyn
Mit
Code: (dl )
if (/$code1/ && /$code2/) { ...

funktioniert das.

Mit
Code: (dl )
1
2
my $code = "\(C\.\*\)\{2\}\/ \&\& \/ $best \| $best\[M\] ";
if (/$code/) { ...

geht es nicht.

Beim ersten Beispiel hast Du zwei unabhängige Matches, die beide erfüllt sein müssen. Das kannst Du auch in
Code (perl): (dl )
if (m/$code1/ and m/$code2/) { ...
umschreiben.

Im zweiten Fall muss der String mit folgender Regex matchen:
qr:(C.*)(2)/ && / $best | $best[M] :
Ich bin mir jetzt nicht über die Bindungswirkung des '|' sicher, aber
'C.*2' matched nur noch wenn die 2 unmittelbar von '/ && /' gefolgt wird, da dies keine speziellen Zeichen in der Regex sind.
(Einen logischen Und-Operator für Regex gibt es nicht.)

Wenn Du willst, dass Dein String $code1 und $code2 enthält egal in welcher Reihenfolge und ggf. auch überlappend, musst Du den ersten Ansatz mit zwei unabhängigen Matches wählen. Das in eine einzige Regex zu packen ist zu kompliziert.

Wenn $_ die Codes hintereinander enthalten soll (egal, was dazwischen steht)
kannst Du qr($code1.*$code2) verwenden. da kannst Du dann auch noch bestimmen, was zwischen den Codes stehen darf, indem DU ".*" entsprechend ersetzst.

View full thread Suchstrings kombinieren