2017-01-26 4 views
1

Warum stimmt der folgende Code nicht überein? der Ausdruck ist nicht so schwierig und Online-Regex-Tester auch sagen, dass es funktionieren sollte. Mache ich etwas falsch mit den Fluchten?Warum passt diese Regex nicht?

QRegExp rex("(.*?)(\\d+\\.\\d+)_(\\d+\\.\\d+).*?"); 
    QString fileName("tile_10.0000_47.3100_0.1_.dat"); 

    if (rex.indexIn(fileName)>=0) { 
    // ... 
    } 
+0

Vielleicht 'rex (" ([^ _] *) _ (\ \ d + \\. \\ d +) _ (\\ d + \\. \\ d +) ")' wird funktionieren, wie Sie brauchen? Oder sogar 'rex ("^([^ _] *) _ (\\ d + \\. \\ d +) _ (\\ d + \\. \ \ D +) ")' wenn Sie vom Anfang an übereinstimmen müssen die Saite. –

Antwort

2

QRegExp hilft nicht faul quantifiers unterstützen, so ist *? hier nicht arbeiten. Auch die .*? am Ende des Musters passt zu keinem Text, es kann sicher entfernt werden.

Ich schlage vor, die erste .*? mit ([^_]*)_ Muster ersetzt (0+ Zeichen andere als _ und einem _ direkt nach ihnen) mit dem ersten digits.digits Text zu erhalten:

rex("([^_]*)_(\\d+\\.\\d+)_(\\d+\\.\\d+)") 

Oder, wenn Sie brauchen Passen Sie die Daten vom Anfang des Strings an, und setzen Sie das Muster mit ^ voran (Anfang des Strings).

0

Eine possile Änderung könnte sein:

(.*?)(\d+\.\d+)_(\d+\.\d+)_(\d+\.\d+)_\..* 

die zu Ihrem Beispiel ist sehr streng.

Und hier eine, die jede Folge von Zahlen gefolgt von Unterstrichen bis Dateierweiterung akzeptiert.

(.*?)((\d+\.\d+)_+)\..* 

Hoffnung, die

0

Sie können auch das Verhalten quantifiers ändern mit QRegExp.setMinimal() ihnen nicht gierigen standardmäßig und mit einer kleinen Änderung an Ihr Muster zu machen:

QRegExp rex("(.*)(\\d+\\.\\d+)_(\\d+\\.\\d+)(\\D.*|$)"); 
rex.setMinimal(true);