Schrift
[thread]8358[/thread]

RegEx Frage (capturing)



<< >> 10 Einträge, 1 Seite
docsnyder
 2006-09-25 17:32
#70238 #70238
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi!

Kann mir jemand sagen, warum der folgende RegEx

Code: (dl )
(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3});


zum Matchen von IP-Adressen "nicht" mit dem folgenden RegEx identisch ist?

Code: (dl )
(?:(\d{1,3})\.){3}(\d{1,3})


Matcht man gegen "10.20.30.40", sind beim ersten RegEx $1, $2, $3, $4 entsprechen mit "10", "20", "30", "40" belegt. Beim zweiten RegEx dagegen, sind nur $3 und $4 mit "30" bzw. "40" belegt.

Beide RegEx matchen, aber beim Zweiten wird beim wiederholten Capturing "(?:(\d{1,3})\.){3}" nur einmal gecaptured, und zwar der letzte Match.

Warum ist das so?

Gruß, Doc
renee
 2006-09-25 17:37
#70239 #70239
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
beim zweiten sind nicht $3 und $4 belegt, sondern $1 und $2!
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
docsnyder
 2006-09-25 17:42
#70240 #70240
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@renee

Stimmt, natürlich hast Du Recht. Es sind $1 und $2, die mit dem 3-ten und 4-ten Match belegt sind.

Aber zurück zu meiner Frage: Warum sind nicht $1 bis $4 belegt?

Gruß, Doc\n\n

<!--EDIT|docsnyder|1159191782-->
pq
 2006-09-25 18:43
#70241 #70241
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
jede klammerung steht für eine ziffernvariable. die erste öffnende klammer
matcht $1, die zweite $2 usw.
das, was du willst, geht also so gar nicht.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
docsnyder
 2006-09-25 18:52
#70242 #70242
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@pq

Warum nicht?

Ich habe immer gedacht,

Code: (dl )
/(x)y(x)y/


wäre identisch zu

Code: (dl )
/(?:(x)y){2}/


Hätte jedenfalls eine gewisse Logik, denn wenn ich mit (?:...){2} repeaten will, dann hätte ich das, was da drin steht eben genau zwei mal, bzw. erwarte das gleiche Verhalten wie wenn ich es zweimal hinschreibe, oder?

Gruß, Doc
Linuxer
 2006-09-25 22:12
#70243 #70243
User since
2006-01-27
3870 Artikel
HausmeisterIn

user image
[quote=docsnyder,25.09.2006, 16:52]Hätte jedenfalls eine gewisse Logik, denn wenn ich mit (?:...){2} repeaten will, dann hätte ich das, was da drin steht eben genau zwei mal, bzw. erwarte das gleiche Verhalten wie wenn ich es zweimal hinschreibe, oder?[/quote]
Die Definition sagt, dass nur die Klammern zählen, die ich hinschreibe; nicht jene, die durch Quantifier hinein"multipliziert" werden (bzw. sie sagt nicht, dass jene hineinmultiplizierten zählen würden).

Ich kann Deinen Ansatz verstehen und habe mich auch drüber gewundert; aber:

Wie weit soll die RE-Maschine denn mitarbeiten, wenn die Quantifier variabel werden? Wie weit soll sie Capturing betreiben und Ressourcen verschlingen?

Und das nur, weil der Programmierer dieses Verhalten vergessen hat und "mal eben" 65535 Submatches einfangen will ;o))

Wer 512 Submatches einfangen will, soll auch ebensoviele Klammerpaare setzen ;o))

Da finde ich die bisherige Handhabung sinniger.

Dass in der betreffenden Klammerung der letzte Treffer steht, erklär ich mir so (ohne in die RE-Maschine reingesehen zu haben), dass der Treffer bei der Wiederholung immer entsprechend überschrieben wird.
Z.B. beim IP-Match.

Code: (dl )
qr/(?:(\d{1,3})\.){3}(\d{1,3})/;


Es zählen die gesetzten Klammern; also gibt es $1 und $2 als Ergebnis, die abfragbar wären (Ich benutze $1 mal als Synonym für die eigentliche Klammerung).
$1 soll dabei 3mal vorkommen (gedacht war ja, dass es zu $1, $2 und $3 würde).
Für den ersten Durchlauf der Wiederholung wird das erste Oktett in $1 abgelegt; beim 2. das zweite und beim finalen 3. Durchlauf landet das dritte Oktett in $1. Danach kann $2 noch das vierte Oktett einfangen und fertig ist das Matching ...

Soweit meine Gedankengänge zu dem Thema...

[edit]Themen-Beobachtung aktiviert[/edit]\n\n

<!--EDIT|Linuxer|1159208834-->
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!
Gast Gast
 2006-09-25 23:09
#70244 #70244
@Linuxer

Quote
Wie weit soll die RE-Maschine denn mitarbeiten, wenn die Quantifier variabel werden? Wie weit soll sie Capturing betreiben und Ressourcen verschlingen?

Und das nur, weil der Programmierer dieses Verhalten vergessen hat und "mal eben" 65535 Submatches einfangen will ;o))

Wer 512 Submatches einfangen will, soll auch ebensoviele Klammerpaare setzen ;o))


Sorry, aber genau das würde ich von einer RegEx-Maschine erwarten, nämlich, daß ich eben "nicht" 512 mal hinschreiben muß, was ich möchte, denn ich "möchte" es ja! Warum also nicht kurz, wie es in Perl normalerweise gängig (und elegant) geht?

Man könnte ja für den "letzten" Match (bei Vervielfachern) ja auch sowas eingeführt haben wie

Code: (dl )
/(?:(\d{1,3})\.){-1}(\d{1,3})/


Das würde zudem auch noch mit der Perl-Philosophie harmonieren.

Ich nehme das Verhalten von Perl so hin (muß ich ja), aber ich hätte es mir wirklich anders gewünscht.

Und das sind meine Gedanken dazu.

Gruß, Doc
Ronnie
 2006-09-25 23:18
#70245 #70245
User since
2003-08-14
2022 Artikel
BenutzerIn
[default_avatar]
Apropos: Regex

Auf http://www.dethix.de bzw. RubyMine hat WoNáDo einige sehr gute Artikel zum Thema reguläre Ausdrücke geschrieben. Die Artikel sind zwar ruby-bezogen aber trotzdem sehr interessant.\n\n

<!--EDIT|Ronnie|1159212065-->
pq
 2006-09-26 01:00
#70246 #70246
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
[quote=Guest,25.09.2006, 21:09]Sorry, aber genau das würde ich von einer RegEx-Maschine erwarten, nämlich, daß ich eben "nicht" 512 mal hinschreiben muß, was ich möchte, denn ich "möchte" es ja! Warum also nicht kurz, wie es in Perl normalerweise gängig (und elegant) geht?[/quote]
einfache frage: was würdest du dir bei folgender regex vorstellen?
m/ (?: (x) y ){2,4} (foo) /ix
bei perls jetzigem verhalten weiß ich: das, was (foo) matcht, steht in $2.
bei dem von dir gewünschten verhalten wüßte ich jetzt gar nicht, ob
es in $3, $4 oder $5 steht.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
docsnyder
 2006-09-26 12:17
#70247 #70247
User since
2005-09-08
300 Artikel
BenutzerIn
[Homepage] [default_avatar]
@pq

Gut, da muss ich die Waffen strecken: das wär wirklich blöd, wenn man nicht wüsste, was wie oft matcht.

Danke für das Beispiel ;o)

Gruß, Doc
<< >> 10 Einträge, 1 Seite



View all threads created 2006-09-25 17:32.