Seite 1 von 1

[QRegExp] Keine Whitespaces am Ende der Zeile erkannt

Verfasst: 27. Juli 2007 14:28
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

Verfasst: 27. Juli 2007 17:50
von upsala
Interessanter Beispielcode... QRegExp kann auf jeden Fall Leerzeichen am Ende eines String mit deiner RegEx finden...

Verfasst: 31. Juli 2007 11:45
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".

Verfasst: 1. August 2007 11:14
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

Verfasst: 1. August 2007 12:39
von upsala
Wo bleibt der Beispielcode?

Verfasst: 1. August 2007 13:21
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;
}

Verfasst: 1. August 2007 15:44
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

Verfasst: 1. August 2007 16:10
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