2011-12-20 10 views
25

私は以前作成した投稿を見直していましたが、xmlを解析するためにRegexを使用しないことを示唆する多くの人々に気付きました。その場合、XMLは比較的シンプルで、Regexは何の問題も生じませんでした。私は他の多くのコードフォーマットも解析していたので、一貫性のためには意味がありました。しかし、これが他のケースでどのように問題を引き起こすかは私は不思議です。これはちょうど「車輪のタイプの問題を再発明しないでください?なぜ正規表現でXMLを解析するのは悪い考えですか?

+0

おそらく、パーサー_built into_プログラミング言語やGTKなどのフレームワークを含む数千のxmlパーサーが既に存在するためです。 – ApprenticeHacker

+2

@Michaelはリンクを待っています。 – ApprenticeHacker

+4

正規表現を使用して、XMLの小さな予測可能な制限付きスニペットから情報を抽出することができます。問題はありませんが、正規表現は** XML全体を解析することを目的としていません。それは、ボールペンのハンマーを使ってオレンジをはがすのと同じです。 – BoltClock

答えて

34

実際の問題はネストされたタグです。ネストされたタグは、正規表現では扱いにくいです。 balanced matchingで可能ですが、それは.NETでのみ利用でき、おそらく他の2つの味です。しかし、バランスの取れたマッチングの力でも、不適切なコメントは潜在的に正規表現を捨てる可能性があります。

例えば、これはあなたが正規表現と時間のためにこのようなエッジの例を追いかけ、そしておそらく解決策を見つけることができ...

<div> 
    <div id="parse-this"> 
     <!-- oops</div> --> 
     try to get this value with regex 
    </div> 
</div> 

解析するトリッキーなものです。しかし、実際には、XML、XHTML、およびHTMLパーザーがあり、より信頼性高く効率的に仕事を行うことができます。

+0

数字のエンティティまたはDTDディファイメントエンティティをスローして、難しくする必要があります。 – binki

5

これはここで何度も議論されています。例えば、

Can you provide some examples of why it is hard to parse XML and HTML with a regex?

Why it's not possible to use regex to parse HTML/XML: a formal explanation in layman's terms

ちょうどより多くの答えに、画面の右側にあるリンクをたどります。

私の結論:正規表現はパーサではないので、

シンプル、そのツールがパターンを見つけることができます。

(ht | x)mlファイルで非常に特定のパターンを検索したい場合は、正規表現が最適です。

しかし、すべてのFooタグで何かを検索している場合、パターンが一致しないため、パーサーを使用して、ネストすることができます。もう

+0

XpathはRegex for XMLの一種です。問題は、正規表現は再帰を理解できないということです。 –

+0

@AK_ XPathは一種の正規表現ではありません。 * [XPath](http://en.wikipedia.org/wiki/XPath)は、XML文書*からノードを選択するためのクエリ言語です。それは正規表現とは関係ありません。そして私はあなたが私の答えを理解していることを疑う。問題は、正規表現が再帰を理解しないということではなく、次のことを理解することです:[regular-expression.info参照](http://www.regular-expressions.info/recurse.html)。問題は、(ht | x)mlが非常に異なって見えますが、同じ結果があることです。たくさんの努力(あなたは正規表現で(ht | x)mlを解析することができます)(http://stackoverflow.com/a/4234491/626273)でも、既存のパーサははるかに簡単です – stema

+0

1.何を参照していますか〜は、拡張です。これらはComSciの意味での正規表現ではありません。 2. [this](http://en.wikipedia.org/wiki/Chomsky_hierarchy)と背景の説明をお読みください。正規表現に影響されないxmlドキュメントを作成するのは簡単です。 3.実際に** XPathとXsdを使用することができます** Regexで行うことができるもの、検証のようなもの、ドキュメント内のものを探すもののいくつかについては**です。彼らは....修辞的な意味で似ています:-) –

3

XMLは正規表現ではありません(専門用語です)。正規表現を使用してXMLを正しく解析することはできません。あなたは99%成功するかもしれませんが、誰かがあなたを投げるXMLを書く方法を見つけるでしょう。

スクリーンスクレーパーのようなものを書いているなら、99%の成功率で十分でしょう。ほとんどのアプリケーションでは、そうではありません。

+1

正規表現は当初は通常の言語のみを扱うように設計されていましたが、現代的な実装にはルックアラウンド、後方参照、時にはバランスのとれたマッチングが含まれています。でも、XMLやhtmlのような複雑なものではまだまだ充分ではありません。 –

+2

私は、正規表現を使ってXMLを解析しようとしたことはありませんでした。 –

+0

私は同意します。私はかつて同じ引数をとったので、正規表現全体を言いたかっただけですが、正規表現を使用して、後で私の間違いを認識しました。 –

関連する問題