12

私はいつもこのような正規表現を書いてきました

<A HREF="([^"]*)" TARGET="_blank">([^<]*)</A>

しかし、私はこの怠惰なことについて学び、このように書くことができることを知りました

<A HREF="(.*?)" TARGET="_blank">(.*?)</A>

この2番目のアプローチを使用することに不利な点はありますか? 正規表現は間違いなくよりコンパクトです(SOでもより適切に解析されます)。

編集:ここには2つの最良の答えがあり、式の2つの重要な違いを指摘しています。ysthの答えは、貪欲でない/怠惰なものの弱点を指摘しており、ハイパーリンク自体にAタグの他の属性が含まれる可能性があります(間違いなく良くありません)。Rob Kennedy は貪欲な例の弱点を指摘しています。アンカー テキストには他のタグを含めることはできません (すべてのアンカー テキストを取得するわけではないため、間違いなく問題ありません)。同じように見える遅延ソリューションと非遅延ソリューションは、おそらく意味的に同等ではありません。

編集:3番目に良い答えは、式の相対速度に関するAlan Mによるものです。当分の間、私は彼をベストアンサーとしてマークし、人々が彼により多くのポイントを与えるようにします:)

4

6 に答える 6

12

考慮すべきもう 1 つのことは、ターゲット テキストの長さ、および量化された部分式によって一致する量がどれくらいになるかです。たとえば、大きな HTML ドキュメント内の <BODY> 要素全体を一致させようとしている場合、次の正規表現を使用したくなるかもしれません。

/<BODY>.*?<\/BODY>/is

しかし、それは不必要な作業を大量に行うことになり、一度に 1 文字ずつ照合しながら、各文字の前に否定的な先読みを効果的に行います。</BODY> タグがドキュメントの最後近くに配置されることはわかっているので、通常の貪欲な数量詞を使用するのが賢明です。ドキュメントの残りの部分を丸呑みしてから、終了タグに一致するために必要な数文字をバックトラックします。

ほとんどの場合、貪欲な量指定子と消極的な量指定子の速度の違いに気付くことはありませんが、覚えておく必要があります。気が進まない量指定子を慎重に使用する必要がある主な理由は、他の人が指摘したことです。マッチ。

于 2008-12-15T01:57:52.400 に答える
8

補完された文字クラスは、一致させたいものをより厳密に定義するため、可能な限り使用します。

非貪欲な正規表現は、次のような、おそらく望ましくないものと一致します。

<A HREF="foo" NAME="foo" TARGET="_blank">foo</A>

最初の .* はどこですか? マッチ

foo" NAME="foo
于 2008-12-14T19:51:33.030 に答える
7

あなたの例は同等ではないことに注意してください。img最初の正規表現は、またはなどの他のタグを含むリンクを選択しませんb。2 番目の正規表現はそうです。とにかく、それがおそらくあなたが望んでいたものだと思います。

意味の違いに加えて、私が考えることができる唯一の欠点は、貪欲でない修飾子のサポートが、文字クラスの否定ほど普及していないことです。確認する前に思っていたよりも広くサポートされていますが、GNU Grep がリストに含まれていないことは注目に値します。使用している正規表現エバリュエーターがそれをサポートしている場合は、それを使用してください。

于 2008-12-14T19:16:50.447 に答える
3

良くも悪くもありません。私が最もよく目にする用語は貪欲対貪欲でないというものですが、これらは 2 つの異なることを行っていると言えます。タスクに適したものを使用したい。つまり、1 行で複数の一致をキャプチャしたくない場合は、貪欲なオプションをオフにします。

于 2008-12-14T18:40:29.583 に答える
1

「怠け者」はここでは間違った言葉です。貪欲とは対照的に、貪欲でないことを意味します。私が知っている限り、それを使用することに不利な点はありません。しかし、あなたの特別なケースでは、より効率的であるべきではありません。

于 2008-12-14T18:40:22.080 に答える
1

貪欲でないほうがいいですね。通常の kleene クロージャ (*) は逆方向に動作し、残りの入力を照合し、一致するまで何かを削除します。

結局、彼らは違うことをしますが、貪欲でない方が貪欲よりも優れていると思います。私はこれをテストしていませんが、今は興味があります。

于 2008-12-14T18:42:38.050 に答える