2017-01-26 6 views
1

次のコードが一致しないのはなぜですか? 表現はそれほど難しくはなく、オンラインの正規表現テスト担当者も動作するはずだと述べています。エスケープに間違ったことをしていますか?なぜこの正規表現は一致しませんか?

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

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

たぶん 'レックス("([^ _] *)_(\ \ d + \\。\\ d +)_(\\ d + \\。\\ d +) ")'必要に応じて動作しますか?または、あなたが最初から一致する必要がある場合は、 'rex(" ^([] _)(\\ d + \\。\\ d +)_(\\ d + \\。\\ d +) ")'文字列 –

答えて

2

QRegExpは怠惰な量指定子をサポートしていないので、*?はここで働いていないお役に立てば幸いです。また、パターンの末尾の.*?はテキストと一致しません。削除することは安全です。

私が最初digits.digitsテキストを取得する([^_]*)_パターン(0+ _以外の文字と右それら_)で最初.*?を置き換える提案:あなたがする必要がある場合

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

あるいは、文字列の先頭からデータを照合し、パターンの先頭に^(文字列の先頭)を追加します。

0

一つpossileの変更は次のようになります。あなたの例には非常に厳しいです

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

ここでは、数字の任意のシーケンスを受け取り、その後にファイル拡張子までアンダースコアを付けます。

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

0

また、デフォルトで、あなたのパターンにほとんど変化してそれらを非貪欲にするためにQRegExp.setMinimal()と数量詞の振る舞いを変更することができます。

QRegExp rex("(.*)(\\d+\\.\\d+)_(\\d+\\.\\d+)(\\D.*|$)"); 
rex.setMinimal(true); 
関連する問題