RegEx Frage 2

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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
BlackJack

@Francesco: '[^\^]' passt auf alles ausser dem ^-Zeichen. Und da ist wirklich das Zeichen '^' gemeint und nicht der Zeilenanfang. Vielleicht (ungetestet): '^.*?[^ ].*\{'
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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.
Zuletzt geändert von /me am Mittwoch 23. November 2011, 09:51, insgesamt 3-mal geändert.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

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.
Francesco
User
Beiträge: 824
Registriert: Mittwoch 1. Dezember 2004, 12:35
Wohnort: Upper Austria

/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]
Antworten