Thread qr// Regex Problem (8 answers)
Opened by MatthiasW at 2008-02-21 19:49

MatthiasW
 2008-02-25 19:19
#106334 #106334
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Ah! Mir ist gerade etwas aufgefallen.

Ich habe folgendes Testskript:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/usr/bin/perl

use strict;
use warnings;

my $rx = qr/(["'])(?:\\[\\"'a-z]|[^\\"'\r\n]|(?!\1)["'])*\1/;

do {
print $_ =~ /^($rx)/ ? "'$_' matcht: $1"
: "'$_' matcht nicht!";
<>;
} foreach (
q("\\\\\\"\\n\\a"),
q("test"),
q("Ein 2ter Test..."),
q("Test mit:)."\n\"",
);

<>;

__END__

Dieses Skript liefert mir nun immer die Ausgabe ... matcht nicht!. Der regex den ich vorher verwendet habe, hatte selbst keinen geklammerten Ausdruck, da er nicht beide Sorten von Anführungszeichen unterstützen musste. Daher gab es dabei auch keine Probleme.
Der neue regex muss nun aber wissen, welches Zeichen am Anfang steht, damit er das Ende des Strings erkennen kann.
Da ich aber innerhalb der Schleife auch Klammern um den eigentlichen regex setze, wird $1 belegt.
Lasse ich die Klammern im regex innerhalb der Schleife weg, bekomme ich die Ausgabe ... matcht: '"'.

Meine aktuelle Lösung ist jetzt: Ich benutze keine Klammern beim matchen und ersetze $1 in der Ausgabe mit $&.
Kann man das noch geschickter/schöner lösen?

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'

View full thread qr// Regex Problem