-1

私はこのようなログファイルを持っています:

<CL>
text sample1
<CL>
<CL>
<TR></TR>
</CL>
<CL>
<CL>
<CL>
<TR1></TR1>
</CL>
<CL>
text sample2
<CL>
text sample3
<CL>
<TR1>
<TR2></TR2>
</TR1>
</CL>

このファイルから有効なxmlを返す正規表現を作成する必要があります。この結果が必要です:

<CL>
<TR></TR>
</CL>

<CL>
<TR1></TR1>
</CL>

<CL>
<TR1>
<TR2></TR2>
</TR1>
</CL>

このバリアントは私には機能しません:

<CL>[\s\S]*?(<CL>[\s\S]+?</CL>)

前もって感謝します。

4

2 に答える 2

2

私が経験したように、正規表現はXMLファイルの検証、解析、および読み取りにはあまり適していません。

この問題には、DOMPARSERソリューションを使用することをお勧めします。それらのほとんどは検証方法を持っています。phpの場合:http://php.net/manual/en/book.simplexml.php(これで多くの作業が行われます)

または、PHP Simple HTML DOMパーサー:http ://simplehtmldom.sourceforge.net/ (xmlファイルを読み取り、xmlから作成されたオブジェクトを出力し、有効なxml構造体を取得します。これは、HTML構造体だけで機能するわけではないことを覚えています)。 java:JSOUPライブラリhttp://jsoup.org/(phpのsimpledomとほぼ同じ)

そして最初に、有効なxmlファイルにはルートタグが含まれている必要があります(htmlファイルのHTMLタグのように、これはドキュメントをラップします)

これがお役に立てば幸いです

于 2013-03-06T08:52:48.110 に答える
1

この正規表現はあなたの例で機能します

"<CL>((?!<CL>).)*?(?:<TR[\\d]*?>)+.*?(?:</TR[\\d]*?>)+.*?</CL>"

プログラミング言語に依存することに注意してください。Singlelineこの正規表現を機能させるには、正規表現オプションを設定する必要があります

EDIT一部の言語では \d をエスケープする必要がないため、こちらも試してください

"<CL>((?!<CL>).)*?(?:<TR[\d]*?>)+.*?(?:</TR[\d]*?>)+.*?</CL>"

EDIT2 clタグのコンテンツをキャッチしたいだけの場合は、次を使用できます。

<CL>((?!<CL>).)*</CL>
于 2013-03-06T08:56:40.423 に答える