Hauptmenü

Perl Regex Problem

Begonnen von SpenZerX, 24 April 2016, 12:18:12

Vorheriges Thema - Nächstes Thema

SpenZerX

Hallo,

ich habe ein Problem mit einer Regex die ich in mehreren Online Testern erfolgreich geprüft habe.

Kann es sein das es bei meiner Perl Version Probleme mit der Kompatibilität bei komplexeren Regular Expressions gibt?

Oder habe ich einfach etwas übersehen?

Die Daten werden nicht so extrahiert wie im Online Tester ...


#Ist (Debug Log vom Code):
#2016.04.24 11:53:04.180 5: Got Msg:my://user:pass@www.perl.de:1234/Test.xyz?AV15=0.000&STATE=ON!
#2016.04.24 11:53:04.180 5: TEST: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:

# Erwartet gemäß diverser Online Regex Tester: (regexr.com, weitere ...)
#1.   [0-2]   `my`
#2.   [5-31]   `user:pass@www.perl.de:1234`
#3.   [5-14]   `user:pass`
#4.   [5-14]   `user:pass`
#5.   [15-26]   `www.perl.de`
#6.   [27-31]   `1234`
#7.   [31-40]   `/Test.xyz`
#8.   [32-40]   `Test.xyz`
#11.   [41-60]   `AV15=0.000&STATE=ON`


  my $msg = 'my://user:pass@www.perl.de:1234/Test.xyz?AV15=0.000&STATE=ON';
  Log3 $hash, 5, "Got Msg:$msg!";

  $msg =~  /^([a-z][a-z0-9+.-]*):(?:\/\/((?:(?=((?:[a-z0-9-._~!$&'()*+,;=:]|%[0-9A-F]{2})*))(\3)@)?(?=(\[[0-9A-F:.]{2,}\]|(?:[a-z0-9-._~!$&'()*+,;=]|%[0-9A-F]{2})*))\5(?::(?=(\d*))\6)?)(\/(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/]|%[0-9A-F]{2})*))\8)?|(\/?(?!\/)(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/]|%[0-9A-F]{2})*))\10)?)(?:\?(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/?]|%[0-9A-F]{2})*))\11)?(?:#(?=((?:[a-z0-9-._~!$&'()*+,;=:@\/?]|%[0-9A-F]{2})*))\12)?$/ig;

  Log3 $hash, 5, "TEST: 1:$1 2:$2 3:$3 4:$4 5:$5 6:$6 7:$7 8:$8 9:$9 10:$10 11:$11 12:$12";

viegener

Ob Deine Perl-Version sich anders verhält als andere ist schwer zu beantworten ohne dass Du etwas zu Deiner Perl-Version sagst  ;)

Also handelt es sich wohl um eine retorische Frage und eigentlich suchst Du jemanden, der Deinen Perl-Ausdruck debugged  8)
Da der Perl-Ausdruck aber 429-Zeichen lang ist, erscheint das auch nicht rivial.

Generell matcht Dein Ausdruck wohl nicht den String, den Du vorgibst denn alle $n sind leer.
Mein Vorschlag in diesem Fall Teile und herrsche, also

1) Baue erst mal einen simplen Ausdruck auf, der den Gesamt-Ausdruck matcht
2) Baue dann darin grössere Teile ein, die Du danach weiter zerlegen kannst (Also nicht Protokoll, user/pass und server nicht separat sondern in einem).
3) Identifiziere eindeutige Trennzeichen als wenn sichergestellt ist, dass der Benutzer keinen Doppelpunkt enthält würde ich für den Match des Benutzers etwas wie ([^:]+):. Gerade wenn andere Zeichen vorkommen können als im Testausdruck, musst Du für eindeutige Trennzeichen sorgen (was passiert wenn im Kennwort Trennzeichen vorkommen

Wofür setzt Du den modifier g ein, wenn Du sowieso einen vollständigen Ausdruck matchst?

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

SpenZerX

Hallo,

ja den Ausdruck zu zerlegen war auch mein Ansatz. Habe damit gestern mehrere Stunden verbracht. Ich konnte aber noch nicht herausfinden warum mein Perl andere Ergebnisse zeigt. Heute gehts weiter.

Die Frage ist auch eher ob vielleicht Inkompatibilitäten bekannt sind?

Insbesondere bei Regex-Syntax:
-Positive lookahead / lookbehind
-Non capturing group
-Backreference

und wie zu erklären ist, das mehrere Online Tools, die Perl Compatible Regular Expressions (PCRE) testen hier zu meinem Perl abweichen.

Ich muss das noch weiter analysieren ...

viegener

Ich denke nicht, dass Du Dich auf online tester verlassen kannst, denn der von Dir angebene Tester regexr sagt klar, dass es Unterschiede gibt und dass er die regex engines des Browsers (!) verwendet und javascript regexp syntax. Zumindest regexr macht eben gerade nicht PCRE.

Meiner Erfahrung nach gibt es zig Varianten bei der Syntax für regexp und da reden wir noch gar nicht von unterschiedlichen Varianten von  lookahead etc. Auch PCRE ist eben nicht Perl ...

Die Frage ist wiederum Inkompatibilitäten mit was (Du sagst ja nicht welche Version, Plattform etc) Du einsetzt. Meines Wissens ist Perl relativ stabil bei den regexp in perl5.

Achso: Gibt es denn eine Fehlermeldung wenn Du den Code ausführst (Bei mir gibt es welche ...)



Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

SpenZerX

Ok habe den Fehler gefunden.

Es müssen mehr Zeichen als in den Online Tools escaped werden wie z.B.das  &.



Danke für die Hilfe.