webdevqa.jp.net

欲張りでない正規表現を書くにはどうすればいいですか?

欲張りでないオプションを使った正規表現のマッチングについての助けが必要です。

一致パターンは次のとおりです。

<img\s.*>

一致させるテキストは次のとおりです。

<html>
<img src="test">
abc
<img
  src="a" src='a' a=b>
</html>

私は http://regexpal.comでテストします

この式は、<imgから最後の>までのすべてのテキストに一致します。最初の>の後に最初に見つかった<imgと一致させる必要があるので、ここでは2つの一致を取得する必要があります。

欲張りでない?のすべての組み合わせを試してみましたが、成功しませんでした。

273
Pointer Null

貪欲でない?は完全にうまくいきます。テスト対象の正規表現エンジンで、 dotがall オプションに一致することを選択する必要があるだけです(使用しているエンジンであるregexpalも同じオプションです)。これは、.を使用すると、正規表現エンジンは一般に改行を一致させないためです。 .で改行も一致させたいことを明示的に伝える必要があります。

例えば、

<img\s.*?>

正常に動作します!

ここで の結果を確認してください

また、 how dot が動作する について、さまざまな正規表現で読んでください。

390
Pavan Manjunath

?オペランドは、一致を欲張りではないものにします。例えば。 .*は貪欲ですが.*?はそうではありません。そのため、タグ全体を一致させるために<img.*?>のようなものを使うことができます。または<img[^>]*>

しかし、HTML全体を実際には正規表現で解析できないことを忘れないでください。

63
Ilya

スタックオーバーフローをチェックする質問正規表現の文脈において、怠惰で欲張りとはどういう意味ですか?も。

欲張りとは、可能な限り最長の文字列と一致することを意味します。

遅延とは、最短の文字列と一致することを意味します。

例えば、貪欲なh。+ lは 'hello'の 'hell'と一致しますが、遅延h。+?lは 'hel'と一致します。

1
Rahul

ここでの他の答えは、欲張りでないマッチングをサポートする正規表現エンジンを持っていることを前提としています。これはPerl 5で導入され、他の現代言語に広くコピーされた拡張です。しかしそれは決して遍在的ではありません。

古い言語やエディタの多くは伝統的な正規表現しかサポートしていません。これは繰り返し演算子*の欲張りを制御するメカニズムを持っていません - それは常に可能な限り最長の文字列にマッチします。

トリックはそれからそれが最初にマッチすることが許されるものを制限することです。 .*の代わりにあなたが探しているようです

[^>]*

それでも なにか のできるだけ多くにマッチする。しかし なにか .の「任意の文字」だけではなく、「>以外の任意の文字」でもあります。

アプリケーションによっては、「任意の文字」に改行を含めることを許可するオプションを有効にするかどうかを選択します。

正規表現エンジンが欲張りでないマッチングをサポートしている場合でも、実際に何を意味しているのかを詳しく説明することをお勧めします。この - の意味であるなら、(おそらく、おそらく)Do I I Meanへの欲張りでないマッチングに頼るのではなく、おそらくこれを言うべきです。

もちろん、これは<img title="quoted string with > in it" src="other attributes"> and perhaps <img title="nested tags">に対処する必要がある場合にはまだ望みどおりのものではありませんが、その時点で、最初は正規表現を使用しないようにしてください。

0
tripleee