[QRegExp] Keine Whitespaces am Ende der Zeile erkannt

Alles rund um die Programmierung mit Qt
Antworten
DarkWotan
Beiträge: 65
Registriert: 18. Mai 2006 10:03

[QRegExp] Keine Whitespaces am Ende der Zeile erkannt

Beitrag von DarkWotan »

Hallo,

kann es sein, dass die RegExp-Engine von Qt (getestet: 4.3.0) keine Whitespaces am Ende der Zeile findet?
In folgendem Text wird mit keine Whitespaces am Ende der Zeile gefunden.

Code: Alles auswählen

#include <iostream>

int main()  
{
  using namespace std;   
  
  cout << "Hallo Welt!" << endl;
  
  return 0;
}
Woran liegt das? Das verwendete QRegExp-Objekt ist via

Code: Alles auswählen

QRegExp::QRegExp ()
erzeugt worden und nicht weiter parametrisiert.

MfG, Cedric
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Interessanter Beispielcode... QRegExp kann auf jeden Fall Leerzeichen am Ende eines String mit deiner RegEx finden...
Zandru
Beiträge: 84
Registriert: 29. Mai 2007 15:35

Beitrag von Zandru »

schreib mal einen kompletten Beispielcode rein. Könnte es sein, dass du vergessen hast \ durch \\ zu ersetzen?

QRegExp("\s+$") geht jedenfalls schief - das \ wird von C "gefressen".
DarkWotan
Beiträge: 65
Registriert: 18. Mai 2006 10:03

Beitrag von DarkWotan »

Zandru hat geschrieben:schreib mal einen kompletten Beispielcode rein. Könnte es sein, dass du vergessen hast \ durch \\ zu ersetzen?

QRegExp("\s+$") geht jedenfalls schief - das \ wird von C "gefressen".
Daran liegt es definitiv nicht. Ich gebe die RegExp über ein QLineEdit ein, das nimmt das das Escapen schon automagisch vor bzw. macht es unnötig. Außerdem habe ich diese Expressions schon mit anderen, ähnlichen Texten probiert, da hat es funktioniert.

MfG, Cedric
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wo bleibt der Beispielcode?
DarkWotan
Beiträge: 65
Registriert: 18. Mai 2006 10:03

Beitrag von DarkWotan »

upsala hat geschrieben:Wo bleibt der Beispielcode?

Code: Alles auswählen

#include <cstdio>
#include <QtCore>

int main()
{  
  QTextStream out(stdout);
  QString source = 
  
  "#include <iostream> \n"
  "\n"
  "int main()  \n"
  "{ \n"
  "  using namespace std;    \n"
  "  \n"
  "  cout << "Hallo Welt!" << endl;\n"
  "  \n"
  "  return 0; \n"
  "} \n";
  
  QRegExp re;
  re.setPattern("\\s+$"); 
  
  out << "Found " << source.count(re) << " times." << endl;
  
  return 0;
}
bst
Beiträge: 56
Registriert: 7. November 2006 13:16
Wohnort: Ilsfeld

Beitrag von bst »

Hi,

QRegExp kennt keinen Multiline-Modus, d.h. das $ matched nur am Ende des gesamten Strings, nicht auch innerhalb des Strings bei einem Zeilenwechsel.

D.h. Du hast hier nur einen einzigen Match " \n".

Nimm einfach mal einen Replace, dann siehst Du das selber.

Code: Alles auswählen

  out << source.replace(re, "_") << endl; 
Count zählt - wozu das auch immer gut sein soll ? - 'überlappende' Matches, liefert hier also zwei. M.E. (ungetestet) einmal " \n$" und einmal "\n$". Mit einem:

Code: Alles auswählen

re.setPattern(" \\s+$");
liefert count dementsprechend nur noch 1 zurück.

cu, Bernd
DarkWotan
Beiträge: 65
Registriert: 18. Mai 2006 10:03

Beitrag von DarkWotan »

Interessant. D. h. entweder ich bastele mir ein Workaround speziell für meinen Anwendungsfall oder ich leite eine Klasse MultilineRegExp von QRegExp ab und überschreibe ein paar Methoden, wobei letzteres sich wegen fehlender virtuellen Methoden für QString::find() gar nicht lohnen würde.

MfG, Cedric
Antworten