Seite 1 von 1

RegEx Frage 2

Verfasst: Mittwoch 23. November 2011, 09:14
von Francesco
Hallo, zweite Frage zu einen regulären Ausdruck:

Ich möchte alle Zeilen finden, die mit { enden, jedoch nicht vom zeilenanfang bis { mit spaces gefüllt sind, d.h. irgendein non-whitespace character noch vor dem { auftreten.

Vielleicht denke ich verkehrt oder zu kompliziert:

Code: Alles auswählen

[^\^] *{ *$
Ich meine, spaces, wo vorher keine Zeilenanfang ist (darum das [^\^] gefolgt von 0 der mehr spaces und der Klammer, gefolgt von 0 oder mehr spaces und Zeilenende.
Das wird aber nicht gefunden:
Also gerade das Gegenteil. Anstatt

Code: Alles auswählen

  if (test) {
zu finden, findet der Ausdruck zB

Re: RegEx Frage 2

Verfasst: Mittwoch 23. November 2011, 09:31
von BlackJack
@Francesco: '[^\^]' passt auf alles ausser dem ^-Zeichen. Und da ist wirklich das Zeichen '^' gemeint und nicht der Zeilenanfang. Vielleicht (ungetestet): '^.*?[^ ].*\{'

Re: RegEx Frage 2

Verfasst: Mittwoch 23. November 2011, 09:45
von /me
Francesco hat geschrieben:Ich möchte alle Zeilen finden, die mit { enden, jedoch nicht vom zeilenanfang bis { mit spaces gefüllt sind, d.h. irgendein non-whitespace character noch vor dem { auftreten.
Falls auch nach der öffnenden geschweiften Klammer noch Whitespaces auftreten dürfen:

Code: Alles auswählen

^.*?\S.*{\s*$
Edit: Das erste .* mit einem folgenden Fragezeichen nicht-greedy zu machen, wie BlackJack das getan hat, ist eine gute Idee um unnützes Backtracking zu vermeiden.

Re: RegEx Frage 2

Verfasst: Mittwoch 23. November 2011, 09:50
von Francesco
BlackJack hat geschrieben:@Francesco: '[^\^]' passt auf alles ausser dem ^-Zeichen. Und da ist wirklich das Zeichen '^' gemeint und nicht der Zeilenanfang. Vielleicht (ungetestet): '^.*?[^ ].*\{'
@BlackJack: Super, danke, funktioniert
Wenn man noch hinten anfügt, findet er genau das, was ich möchte.

Re: RegEx Frage 2

Verfasst: Mittwoch 23. November 2011, 09:51
von Francesco
/me hat geschrieben: Falls auch nach der öffnenden geschweiften Klammer noch Whitespaces auftreten dürfen:

Code: Alles auswählen

^.*?\S.*{\s*$
Edit: Das erste .* mit einem folgenden Fragezeichen nicht-greedy zu machen, wie BlackJack das getan hat, ist eine gute Idee um unnützes Backtracking zu vermeiden.
Sehe gerade, /me hat das schon geschrieben, ja \s ist besser als space (nimmt dann die Tabulatoren auch noch mit)

Ja non-greedy ist ein guter Tip obendrein.

Noch eine Kleinigkeit: Das Negationszeichen [^a] (das hier a ausschliesst) kann ja m. Wissens nur direkt hinter der eckigen Klammer auf angeben. Gibt es eine Möglichkeit zu sagen alle nonwhitespaces ausser '/'. Aber so geht das nicht [\S^/].

Nachtrag: ist eigentlich eh kein Problem, weil man das invertierte hinten dranstellen kann.
Also [^/\s]