web-dev-qa-db-ja.com

XMLを正規表現で解析するのはなぜそんなに悪い考えなのですか?

以前に作成した投稿を確認したところ、xmlの解析に正規表現を使用しないことを提案する人がたくさんいることに気づきました。その場合、xmlは比較的単純であり、正規表現は問題を引き起こしませんでした。他の多くのコード形式も解析していたので、統一性のためにそれは理にかなっています。しかし、これが他の場合にどのように問題を引き起こすのか興味があります。これは単なる「車輪の再発明をしない」タイプの問題ですか?

25
yatakaka

本当の問題はネストされたタグです。ネストされたタグは、正規表現で処理するのが非常に困難です。 バランスマッチング で可能ですが、それは.NETと他のいくつかのフレーバーでのみ利用可能です。しかし、バランスの取れたマッチングの力があっても、不適切なコメントは正規表現を破棄する可能性があります。

たとえば、これは解析するのが難しいものです...

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

このようなエッジケースを正規表現で何時間も追跡し、解決策を見つけることができます。しかし、実際には、より確実かつ効率的に作業を行う特殊なXML、XHTML、およびHTMLパーサーが存在する場合は意味がありません。

41
Steve Wortham

これはここSOで何度も議論されてきました。たとえば、.

正規表現を使用してXMLとHTMLを解析するのが難しい理由の例をいくつか挙げていただけますか?

正規表現を使用してHTML/XMLを解析できない理由:素人の用語での正式な説明

画面の右側にあるリンクをたどると、さらに多くの回答が得られます。

私の結論:

単純です。正規表現はパーサーではないため、パターンを見つけるためのツールです。

(ht | x)mlファイルで非常に特定のパターンを見つけたい場合は、続けてください。正規表現はそのために最適です。

ただし、すべてのFooタグで何かを検索している場合は、属性が異なる順序であり、ネストでき、形式が正しくない(そしてまだ有効である)可能性があります。パターンマッチングが行われなくなったため、パーサーを使用します。

6
stema

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

ある種のスクリーンスクレイパーを作成している場合は、99%の成功率で十分かもしれません。ほとんどのアプリケーションでは、そうではありません。

3
Michael Kay