Seite 1 von 1
Hilfe bei Regulären Ausdruck
Verfasst: 25. September 2009 14:51
von Alex66955
Hey Community,
Ich muss mir ein RegExp zusammenbasteln das folgedens beachtet:
Suche "//" im Text. Darf aber nicht bei "*//*" anspringen und bei "*///" nicht auf die ersten zwei Slash. Hab schon einige ausprobiert aber ich bekomms einfach nicht hin.
einer meiner Ansätze: /(//)|.*[^*](//)|^(//)
Sollte jetzt die Regeln wie oben beschrieben beachten aber ich möchte nur ein Capured haben. Wenn ich versuche eine große Klammer ausenrum zusetzen dann stimmt nichts mehr.
Weis wer Rat?
Re: Hilfe bei Regulären Ausdruck
Verfasst: 26. September 2009 12:10
von neuschi
Alex66955 hat geschrieben:
Ich muss mir ein RegExp zusammenbasteln das folgedens beachtet:
Suche "//" im Text. Darf aber nicht bei "*//*" anspringen und bei "*///" nicht auf die ersten zwei Slash.
Weis wer Rat?
Was ist denn mit
?
hier hab ich keine Klammern eingebaut, denn wozu brauchst du den Capture, wenn du vorher weisst, dass es "//" ist?!
\Ralf
Verfasst: 26. September 2009 14:52
von Alex66955
Aber bei deinem Code matched er
die drei letzen Slash´s mit also stimmt die Positionsangabe auch nicht mehr. Wie oben beschrieben darf es nicht auf die ersten zwei Slash anspringen sondern auf die letzten zwei.
Kann es sein das dies garnicht mit regex zu lösen ist?
Verfasst: 29. September 2009 12:40
von FaS
Klammern ohne dass daraus ein Capture wird geht mit (?:bla), oder in diesem Fall besser mit lookaheads, dann geht er nichtmal darüber und man kann Dinge ausschließen -> Doku
Verfasst: 2. Oktober 2009 13:46
von Alex66955
Ja ich kenne den Syntax (?:..) und Lookheads habe es auch damit versucht aber zum gewollten Ergebniss führte dies auch nicht. Habe es jetzt anderst gelöst und zwar mit einer extra abfrage des Strings.... Naja dachte da gäbs eine andere Möglichkeit
Verfasst: 2. Oktober 2009 17:29
von FaS
Versuch 1:
(?!\*)//
Geht nicht. In der Doku gibt es ein Beispiel für negative lookahead assertions:
"&(?!amp;)" soll das "&" in "&bla" aber nicht in "&" matchen. OK.
Umgedreht geht das aber nicht:
"(?!amp;)&" matched "&" in "amp;&", da ja nicht gesagt wird, dass er von Vorne gucken soll: D.h. er beginnt kurz vor dem "&", da ist ja nichts (oder zu wenig), und nichts ist auch ungleich "amp;" - allerdings könnte man dieselbe Begründung für die rechte Seite nehmen, man hört einfach vorher auf zu suchen. Das scheint mir nicht ganz sauber definiert zu sein.
Das erklärt jedenfalls wieso ein negativer lookahead mit "*" nicht einfach funktioniert.
Geht aber auch anders:
Versuch 2:
(?=^|[^\*])//
Komischerweise funktioniert das auch nicht ("//" in "*//" wird gemached, dabei steht im pattern, dass vor den slashes der textbeginn oder ein zeichen != "*" stehen muss), scheint also wieder ein Fehler oder eine unsaubere Spezifikation oder Dokumentation zu sein, denn dasselbe mit einer non-capturing Klammer funktioniert:
Versuch 3:
(?:^|[^\*])(//)
cap(1) ist hier das gewollte Ergebnis. Denke das ist nicht vollständig, genügt aber deiner Spezifikation.
Ansonsten ist das RegExp-Beispiel von Qt gut zum Herumexperimentieren.
MfG,
FaS