web-dev-qa-db-ja.com

どうすれば私の試合をVimで欲張りにしないようにすることができますか?

私はこのようなマークアップがたくさんある大きなHTMLファイルを持っています。

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

私はすべてのclass=""style=""を取り除くためにVimの検索と置換をしようとしていますが、一致をあいまいにするのに苦労しています。

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

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

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

どうすれば自分の試合を不公平にすることができますか?

457
Mark Biek

.*の代わりに.\{-}を使用してください。

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

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

703
Randy Morris

Vimでの欲張りでない検索は{ - }演算子を使って行われます。このような:

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

ちょうど試して:

:help non-greedy
53
user80168

どうしたの

%s/style="[^"]*"//g
47
Paul Tomblin

もしあなたがより快適なPCRE正規表現構文なら、

  1. あなたがOPで尋ねたように、欲張りでない演算子?をサポートします。そして
  2. グループ化やカーディナリティー演算子をバックハッキングする必要はありません(リテラル文字と一致させるのではなく演算子を指定するので、まったく直感に反するvim構文の要件です)。そして
  3. perlの機能でコンパイルされた[g] vimを使ってテストしてください。

    :機能の確認と検証+ 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>
15
FrDarryl

この種の質問に対する良い解決策は、

:%!sed ... 

(またはPerlがお望みなら) IOWは、vimの正規表現の特殊性を学ぶのではなく、すでに知っているツールを使用してください。 Perlを使うとどうなる?修飾子はマッチを汚すために働く。

11
William Pursell

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

1
bain

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

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