438

非貪欲なオプションを使用した正規表現の一致について助けが必要です。

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

<img\s.*>

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

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

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

<imgこの式は、 fromから lastまでのすべてのテキストに一致します>>initial の後に最初に遭遇したものと一致させる<img必要があるため、ここでは、取得したものではなく 2 つの一致を取得する必要があります。

non-greedy?のすべての組み合わせを試しましたが、成功しませんでした。

4

3 に答える 3

616

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

例えば、

<img\s.*?>

正常に動作します!

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

また、ドットがさまざまな正規表現フレーバーでどのように動作するかについても読んでください。

于 2012-08-10T09:42:12.167 に答える
119

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

ただし、HTMLのセット全体を正規表現で実際に解析することはできないことに注意してください。

于 2012-08-10T09:43:05.677 に答える
24

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

多くの古い、またはより保守的な言語とエディターは、繰り返し演算子の貪欲さを制御するメカニズムを持たない従来の正規表現のみをサポートします。これは*、常に可能な限り長い文字列に一致します。

その場合の秘訣は、最初に一致できるものを制限することです。あなたの代わりに.*探しているようです

[^>]*

これは、可能な限り多くのものに一致します。しかし、何かは単に.「任意の文字」ではなく、「そうでない任意の文字>」です。

アプリケーションによっては、「任意の文字」に改行を含めることを許可するオプションを有効にしたい場合と無効にしたい場合があります。

正規表現エンジンが貪欲でない一致をサポートしている場合でも、実際に何を意味するかを詳しく説明することをお勧めします。これあなたの言いたいことである場合、貪欲ではない一致に頼って (できれば、おそらく) Do What I Mean を行うのではなく、おそらくこれを言うべきです。

たとえば、ワイルドカード like の後に末尾のコンテキストを持つ正規表現は、末尾のコンテキスト(ここでは)が見つかるまで.*?><br/>ネストされたものを飛び越えます。明示的に改行を禁止する) 明らかにそれはできませんし、しません。>><br/>>[^>]*><br/>[^\n>]*><br/>

もちろん、 に対処する必要がある場合、これはまだあなたが望むものではありません<img title="quoted string with > in it" src="other attributes"> and perhaps <img title="nested tags">が、その時点で、最初に言ったように正規表現を使用することを最終的にあきらめるべきです。

于 2018-11-19T05:50:56.190 に答える