Thread RE :: Unorthodoxes Verhalten (3 answers)
Opened by Gast at 2009-01-26 21:21

Linuxer
 2009-01-26 22:38
#118369 #118369
User since
2006-01-27
3882 Artikel
HausmeisterIn

user image
Hi,

das Problem liegt, so vermute ich, darin, dass links vom "(UNIQUE)?" nichts konkretes steht.
So kann ".*" sich erstmal den gesamten String links der ersten eckigen Klammer schnappen.
Da das UNIQUE nicht auftauchen muss (Quantifier: ?), ist der Teil damit erledigt.

Erst wenn links vom "(UNIQUE)?" etwas Konkretes auftritt, das "\s" beispielsweise, wird nochmal genauer hingesehen und das UNIQUE wird entdeckt und eingefangen.

Warum es mit "\s" vor der Klammerung funktioniert, kann ich Dir, ehrlich gesagt, nicht verraten.
Ich hatte eigentlich noch damit gerechnet, dass das UNIQUE damit immer noch vom ".*" verschlungen wird.
Insgesamt beschäftige ich mich zu selten intensiv mit Regex, um darauf eine passende Antwort zu haben. Ein solides Halbwissen ist vorhanden, aber alle relevanten Interna kenn ich nicht.

Ein '.' vorm "(UNIQUE)?" reicht interessanterweise nicht aus, damit UNIQUE gefunden wird.

Besser kann ich es grad nicht erklären. Vielleicht schaltet sich nochmal jemand ein, der/die sich stärker mit Regex, ihrem Debugging (es gibt sicher Module, mit denen man die Arbeitsweise betrachten kann) und ihrem internen Ablauf befasst hat. Vielleicht gibt es dann noch eine konkretere Antwort.

Mein Testskript:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#!/usr/bin/perl
# vi:ts=4 sw=4 et:
use strict;
use warnings;

my $string = 'FOO1 BAR FOO2';

my @regex = (
    qr{(BAR)?},
    qr{(BAR)?.*},
    qr{\s(BAR)?.*},
    qr{.(BAR)?.*},
);

for my $r ( @regex ) {
    my ($m) = $string =~ $r;
    printf "%8s : %s\n", ($m || 'no match'), $r;
}
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread RE :: Unorthodoxes Verhalten