Hilfe bei Regulären Ausdruck

Verschiedenes zu Qt
Antworten
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Hilfe bei Regulären Ausdruck

Beitrag 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?
neuschi
Beiträge: 78
Registriert: 23. Mai 2007 10:59

Re: Hilfe bei Regulären Ausdruck

Beitrag 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

Code: Alles auswählen

[^*]//|^//
?
hier hab ich keine Klammern eingebaut, denn wozu brauchst du den Capture, wenn du vorher weisst, dass es "//" ist?!

\Ralf
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Beitrag von Alex66955 »

Aber bei deinem Code matched er

Code: Alles auswählen

"/*text*///Text"
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?
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag 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
Alex66955
Beiträge: 56
Registriert: 23. September 2009 14:48

Beitrag 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
FaS
Beiträge: 184
Registriert: 25. Mai 2006 19:48
Kontaktdaten:

Beitrag 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
Antworten