0

テキストの開始と終了を検索するために使用する 2 つの QRegExp オブジェクトがあります。私のコードは次のようになります。

// strText defined earlier
QRegExp start(...);
QRegExp end(...);

int iStart = start.indexIn(strText);
int iEnd = end.indexIn(strText, iStart) + end.matchedLength();

このコードに関して 2 つの質問があります。

(1) 各正規表現が探しているテキストが見つかったと仮定します。上記のコードを呼び出すと、実行時に次のエラーが発生します。

TerminalWindow.exe の 0x66b48b3f で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00000004。

コードを次のように変更すると、同じエラーが発生します。

int iStart = start.indexIn(strText);
int iTemp = end.matchedLength();
int iEnd = start.indexIn(strText, iStart) + iTemp;

内部で MatchedLength() がまだ割り当てられていないオブジェクトに対して実行されている可能性があるため、この 2 番目のコード スニペットのエラーは私には理にかなっています。ただし、最初のコード スニペットからも同じエラーが発生する理由がわかりません。他のすべてが等しい場合、操作の順序は左から右ではありませんか? コードを次のように変更すると、期待どおりの結果が得られます。

// strText defined earlier
QRegExp start(...);
QRegExp end(...);

int iStart = start.indexIn(strText);
int iEnd = end.indexIn(strText, iStart);
iEnd += end.matchedLength();

(2) 私の例の strText が次のようになっている場合:

<start>
  stackoverflow is awesome!
</start>
<start>
  I like cake!
</start>
<start>
  Girls are pretty!
</start>

各開始要素の内容をキャプチャする Qt RegExp を作成するにはどうすればよいですか? 何かのようなもの:

QRegExp reg("<start>(.*?)</start>");

POSIX正規表現(Qtが実装していると私が信じているもの)で動作するはずですが、私にとっては決して機能しません。(注: これを行う理想的な方法は、XML/HTML パーサー (実際には HTML を解析しています) を使用することですが、現在、正規表現ソリューションに興味があります)。

ありがとうございました!

4

2 に答える 2

0

最初のコード スニペットでは問題を再現できません。私のUbuntuボックスでは問題なく動作します。

正規表現に関する限り、いくつかの問題があります。まず、?正規表現を非貪欲にするために を使用していますが、 では機能しませんQt。代わりに、QRegExp.setMinimal(bool)メソッドを呼び出す必要があります。QRegExpリファレンスドキュメントを引用:

非貪欲マッチングは個々の量指定子に適用できませんが、パターン内のすべての量指定子に適用できます

文字列が次のような場合:

'<root>\n<start>\nSo is awesome!\n</start>\n<start>\nI like cake!\n</start>\n</root>'

次に、次の正規表現が正常に機能します(私のUbuntuボックスでテストされたPyQtバージョン):

QRegExp rx("<start>\n(.*)\n</start>");
rx.setMinimal(true);

あとは、次のようにループするだけです (完全にはわかりません。私は C++ の専門家ではありません)。

QStringList list;
int pos = 0;  
while ((pos = rx.indexIn(str, pos)) != -1) {
    list << rx.cap(1);
    pos += rx.matchedLength();
}

私が目にする2番目の問題は、質問で言っているように、このタスクに正規表現を使用すべきではないということです。XML データを操作するための多くのクラスを含むモジュールをQt提供します。QtXml

あなたの場合、1つの可能性はQDomDocumentクラスを使用することです。次の PyQt コードは、その方法を示しています。

from PyQt4.QtXml import QDomDocument

mydata = "<root><start>\nSo is awesome!\n</start>\n<start>\nI like cake!\n</start><start>\nI like girls!\n</start></root>"
document = QDomDocument()
document.setContent(mydata)
root = document.documentElement()
element = root.firstChildElement("start")
while (not element.isNull()):
    value = element.firstChild().nodeValue()
    element = element.nextSiblingElement("start")
    print value

Qt試してみると、かなり簡単にコードに変換できると思います。

于 2012-12-27T22:06:36.113 に答える
0

<>エスケープする必要があります。試す:

QRegExp reg("\<start\>(.*?)\</start\>");
于 2012-12-27T15:30:04.047 に答える