2
void MainWindow::whatever(){
    QRegExp rx ("<span(.*?)>");
    //QString line = ui->txtNet1->toHtml();
    QString line = "<span>Bar</span><span style='baz'>foo</span>";
    while(line.contains(rx)){
        qDebug()<<"Found rx!";
        line.remove (rx);
    }
}

このツールを使用して正規表現をオンラインでテストしました。指定された正規表現文字列とツールのサンプル テキストを<span style="foo">Bar</span>使用すると、正規表現が文字列内にあるはずであることがわかります。ただし、私の Qt コードでは、while ループに入ることはありません。

Qtや他の言語で正規表現を使ったことはありません。誰か助けてくれませんか?ありがとう!

[編集] QRegExp にはerrorString()、正規表現が無効な場合に使用する機能があることがわかりました。これを出力すると、「繰り返し構文が正しくありません」と表示されます。これが何を意味するのかよくわかりません。もちろん、「悪い繰り返し構文」をグーグルで検索すると、この投稿が表示されます。くそグーグル、あなたは速い。

4

2 に答える 2

11

問題は、QRegExp貪欲な量指定子しかサポートしていないことです。より正確には、貪欲または消極的な量指定子のいずれかをサポートしますが、両方はサポートしません。したがって、演算子<span(.*?)>がないため無効です。*?代わりに、使用できます

QRegExp rx("<span(.*)>");
rx.setMinimal(true);

これにより、デフォルトの動作ではなく、それぞれ 、、およびの動作ですべて *の 、+、およびが得られます。お気づきかもしれませんが、違いは、最小限のバージョンでは、一致する文字ができるだけ多くではなく、できるだけ少ないことです。?QRegExp*?+???

この場合、次のように書くこともできます。

QRegExp rx("<span([^>]*)>");

同じ効果があるので、これはおそらく私がすることです: が表示されるまで一致します>。あなたのものはより一般的です、はい(複数文字の終了トークンがある場合)、単純なケースではこれが少し良いと思います. もちろん、どちらでも機能します。

また、正規表現を使用した HTML の解析には十分注意してください。実際にはできません。タグを認識することは、(私は信じています) 可能ではありますが、これよりもはるかに困難です。(コメント、CDATA ブロック、および処理命令は、作業にレンチを投げかけます。) 見ているデータの種類がわかっている場合、これは受け入れられる解決策になる可能性があります。それでも、代わりに HTML パーサーを調べます。

于 2010-12-22T08:18:59.323 に答える
1

何を達成しようとしていますか?開始タグとその要素を削除する場合は、パターン

<span[^>]*>

おそらく最も単純です。

構文 .*? 広くサポートされている非貪欲な一致を意味しますが、QT 正規表現エンジンを混乱させる可能性があります。

于 2010-12-22T08:15:46.770 に答える