0

HTMLページを解析しようとしていますが、次の正規表現を使用しています:

var regex = new Regex(@"<tag1 id=.id1.>.*<tag2>", RegexOptions.Singleline);

「tag1 id =.id.1」はドキュメント内で 1 回だけ発生します。「tag1」の発生後、「tag2」が50回近く発生します。しかし、ページ コードを正規表現と一致させようとすると、1 つの一致しか返されません。さらに、RegexOptions を「None」または「Multiline」に変更すると、一致が返されません。私はこれについて非常に混乱しており、助けていただければ幸いです。

4

2 に答える 2

2

HTML の解析に regex を使用しないことについての明白な推奨事項はさておき、私はあなたが見ているものを見ている理由を説明することができます。

テキスト内で が 1 回だけ発生する場合tag1、正規表現は 1 回しか一致しないため、複数の一致はあり得ません。正規表現の一致は、一致したテキストを「消費」するため、次の一致の試行は、最後に成功した一致の最後から開始されます。

これは次の問題につながります:.*貪欲であるため、文字列の最後まで (と) 一致し、最後に見つかったものRegexOptions.Singlelineまでバックトラックして一致を成功させます。<tag2>これが、マッチが 1 つしかないもう 1 つの理由です。

2 番目の質問について: を使用しないと、一致が消えるのはなぜRegexOptions.Singlelineですか? シンプル: このオプションがないと、ドットは改行と一致せず、最初の と の.間に少なくとも 1 つの改行があるように見えます。tag1tag2

于 2012-09-20T15:29:52.577 に答える
2

RegEx で Html を解析することは非常に悪い考えであり、世界にはまだ多くの「壊れた html」が存在するため、信頼できません。HTML を解析するには、HTML Agility Packを使用することをお勧めします。これは HTML を解析するための優れたライブラリであり、フィードした HTML で問題が発生したことはありません。

于 2012-09-20T15:21:33.060 に答える