vimでマッチを貪欲にしないにはどうすればよいですか?


480

次のようなマークアップがたくさんある大きなHTMLファイルがあります。

<p class="MsoNormal" style="margin: 0in 0in 0pt;">
  <span style="font-size: small; font-family: Times New Roman;">stuff here</span>
</p>

私はすべてclass=""を取り除くためにVimの検索と置換を実行しようとしていますstyle=""が、マッチを貪欲にするのに問題があります。

私の最初の試みはこれでした

%s/style=".*?"//g

しかしVimは気に入らないようです?。残念ながらを削除する?と、一致が貪欲になります。

どうすればマッチを貪欲にできますか?


パウロの答えは良いと思います。ただ「?」と言うだけ vimでオプションを意味するものではありません(これが「?」を使用して実現したい場合)
LB40

15
@LB、多くの言語、。*?任意の文字に一致するが、貪欲ではないことを意味します。それは彼が達成しようとしていることです。
ランディモリス

回答:


734

.*使用する代わりに.\{-}

%s/style=".\{-}"//g

また、参照してください :help non-greedy


38
あまり直感的ではありませんが、これはvimだけが行うことですか?
Ehtesh Choudhury

95
すべてに独自の正規表現言語があります...これは正規表現の最大の問題の1つです。
Patrick Farrell

35
これらのツールの多くは同じ時期に成熟し、独自に正規表現言語の独自の方言を開発しました。これらのツールの多くはさまざまな問題の解決を試みていたため、これらの実装間で構文が(場合によっては大幅に)異なる可能性があります。開発者としての生活が困難になることもありますが、これが現実の世界のしくみであることを受け入れる必要があります。幸い、最近の多くのツールは、少なくとも正規表現のPerl互換の実装を提供しています。残念ながらVimはその1つではありません。
ランディモリス

15
私のような人がデフォルトで検索を\v(非常に魔法の旗)に設定している場合は、を使用することをお勧めします.{-}
jgillman

48
@Shurane @Ziggyニーモニック:繰り返し{1,3}(ブレース)のように回数を制御します。マイナス記号-は次のことを意味します。できるだけ少なく繰り返します(少し==マイナス);)
Ciro Santilli郝海东冠状病六四事件法轮功

58

vimでの貪欲でない検索は、{-}演算子を使用して行われます。このような:

%s/style=".\{-}"//g

ちょうど試して:

:help non-greedy


17

PCREの正規表現構文に慣れている場合は、

  1. OPで要求したように、貪欲でない演算子?をサポートします。そして
  2. グループ化とカーディナリティー演算子の逆転を必要としません(リテラル文字ではなく演算子を指定するため、直感に反するvim構文の要件)。そして
  3. [g] vimをperl機能でコンパイルし、テストして

    :verおよび検査機能; + perlがある場合は、それで問題ありません)

を使用して検索/置換してみてください

:perldo s///

例。imgタグのsrc属性とalt属性を入れ替えます。

<p class="logo"><a href="/"><img src="/caminoglobal_en/includes/themes/camino/images/header_logo.png" alt=""></a></p>

:perldo s/(src=".*?")\s+(alt=".*?")/$2 $1/

<p class="logo"><a href="/"><img alt="" src="/caminoglobal_en/includes/themes/camino/images/header_logo.png"></a></p>

1
perldoうまく機能しますが、残念ながら、正規表現を入力している間、選択したテストが強調表示されません。
mljrg

12

この種の質問に対する適切な解決策は次のとおりです。

:%!sed ...

(必要に応じてperl)。IOWは、vimの正規表現の特殊性を学ぶのではなく、すでに知っているツールを使用します。perlを使用すると、?修飾子は、マッチを貪欲にするように働きます。


2
良い点、しかし、行うことができること/pattern、あなたがそれを適用し、使用する前に、正しくパターンに一致していることを確認するためにcあなたのvimの正規表現に修飾子は:)もいいです
ジョアン・ポルテラ

これは正しいです。ここでのすべての解決策は貪欲ではありません![0-9] \ {7}を大量のテキストとそのパターンの複数の発生と一致する必要がある場合、ここでの解決策はありません。ここでの解決策は、単純なものに対してのみ機能します(公正であることが求められたものです)。しかし、次の引用まで検索より少しだけ多くしている場合、vimは役に立ちません。
gcb 2014年

4

\v(いくつかのコメントで示唆されているように)

:%s/\v(style|class)\=".{-}"//g

2

プラグインeregex.vimは、Perlスタイルの貪欲でない演算子を処理し*?+?


@xsilenT github.com/othree/eregex.vim: "Vundleまたは病原体を使用してスクリプトをインストールすることをお勧めします。"
eXe

申し訳ありませんが、バンドルまたは病原体の使用方法がわかりません。
xsilen T

-4

G'day、

Vimの正規表現処理はそれほど優秀ではありません。sedの正規表現構文は、vimの機能にほぼ一致していることがわかりました。

私は通常、検索の強調表示を(:set hlsearch)に設定し、スラッシュを入力して検索モードにした後、正規表現で遊んでいます。

編集:マーク、貪欲なマッチングを最小限に抑えるためのそのトリックは、デール・ドウアティの優れた本「Sed&Awk」(Amazonリンクのサニタイズ)でも取り上げられています。

第3章「正規表現構文の理解」は、sedおよびawkに関連するより原始的な正規表現機能の優れた紹介です。短期間で読むことを強くお勧めします。

HTH

乾杯、


7
Vimの正規表現処理は実際には非常に優れています。行/列番号での一致や、キーワードまたは識別子または空白としての文字の言語ごとの分類に基づく一致など、sedではできないことを実行できます。また、ゼロ幅のアサーションと、置換の右側に式を配置する機能もあります。これを使用する\vと、構文が大幅に整理されます。
ブライアンカーパー、

1
@ブライアン、乾杯。私は正規表現のヘルプを行い、何が欠けているかを確認します。
ロブ・ウェルズ

@RobWells、Sed& Awk は確かに非常に優れた本であり、明示的に貪欲/怠惰な数量詞に言葉を費やすことはありません。その証拠として、本ではgreedまたはgreedyの単語は絶対に発生していません。また、lazyの単語は1つしかありませんが、無関係です。
エンリコマリアデアンジェリス

@EnricoMariaDeAngelisですが、例では明示的に用語を参照していません。それは、貪欲でない一致を達成するために「not」演算子を使用するように正規表現を調整する方法についてです。PerlのNFAエンジンでは、貪欲なマッチ動作を具体的に変更する演算子を導入したときに、貪欲と怠惰という用語が登場しました。
ロブ・ウェルズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.