1

XML ファイル内の特定のコード ブロックを探すのに苦労しています。

XML は次のサンプルのようになります。

<object>
   <class>File</class>
   <name>Fall</name>
<desc>Description of Seasons: Fall</desc>
</object>

<object>
   <class>File</class>
   <name>Summer</name>
<desc>Description of Seasons: Summer</desc>
</object>

<object>
   <class>Image</class>
   <name>Summer1</name>
<desc>Image of Seasons: Summer</desc>
</object>

<object>
   <class>File</class>
   <name>Weather3</name>
<desc>Description of Weather</desc>
</object>

基本的に、正規表現で という名前の 2 番目のオブジェクトのみを返すようにしますSummer

これについてどうすればいいですか?

私はここで立ち往生しています:

<object>(.*?)<class>File</class>(.*?)Description of Seasons: Summer(.*?)</object>

しかし、検索結果でも最初のオブジェクトを取得しています。

新しい行を含めるためのドット(。)があるため、構文です。

4

3 に答える 3

3

正規表現を使用しない方がよいでしょう。XML の解析に正規表現を使用してはならない正当な理由については、こちらを参照してください。

はるかに簡単なアプローチは、XPathを使用することです。

//object[name="Summer"]

この XPath 式を XML に適用すると (不正な形式の XML をルート タグで囲んだと仮定して)、「Summer という名前の 2 番目のオブジェクト」のみが選択されます。

すべてではないにしてもほとんどのプログラミング言語(C/C++、Java、.NET、javascript など) でXPathをサポートする XML ライブラリがあります。

于 2013-10-23T23:50:22.600 に答える
0

正規表現は、その名前が示すように、正規言語のみを認識できます。通常の言語は、通常のポンピング補題に従います。これは、(大まかに) 特定のサイズを超える正規言語のすべての有効な単語で、さらに有効な単語を生成するために無限に繰り返されるテキストの部分を見つけることを示しています。

ただし、XML は通常の言語ではなく、CF 言語です。(これは、ポンピング補題 を適用することで証明できます。)

文脈自由言語は、文脈自由文法によってのみ記述でき、文脈自由パーサー (LL(k)/LR(k)、CYK または Earley パーサー) によって解析できます。これらはすべて、正規表現ではできない構文木を生成します。 .

于 2013-10-24T11:00:39.647 に答える