How can I make my match non greedy in vim?

筅森魡賤 提交于 2019-11-26 10:04:19

问题


I have a big HTML file that has lots of markup that looks like this:

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

I\'m trying to do a Vim search-and-replace to get rid of all class=\"\" and style=\"\" but I\'m having trouble making the match ungreedy.

My first attempt was this

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

but Vim doesn\'t seem to like the ?. Unfortunately removing the ? makes the match too greedy.

How can I make my match ungreedy?


回答1:


Instead of .* use .\{-}.

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

Also, see :help non-greedy




回答2:


Non greedy search in vim is done using {-} operator. Like this:

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

just try:

:help non-greedy



回答3:


What's wrong with

%s/style="[^"]*"//g



回答4:


If you're more comfortable PCRE regex syntax, which

  1. supports the non-greedy operator ?, as you asked in OP; and
  2. doesn't require backwhacking grouping and cardinality operators (an utterly counterintuitive vim syntax requirement since you're not matching literal characters but specifying operators); and
  3. you have [g]vim compiled with perl feature, test using

    :ver and inspect features; if +perl is there you're good to go)

try search/replace using

:perldo s///

Example. Swap src and alt attributes in img tag:

<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>



回答5:


I've found that a good solution to this type of question is:

:%!sed ...

(or perl if you prefer). IOW, rather than learning vim's regex peculiarities, use a tool you already know. Using perl would make the ? modifier work to ungreedy the match.




回答6:


With \v (as suggested in several comments)

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



回答7:


Plugin eregex.vim handles Perl-style non-greedy operators *? and +?




回答8:


G'day,

Vim's regexp processing is not too brilliant. I've found that the regexp syntax for sed is about the right match for vim's capabilities.

I usually set the search highlighting on (:set hlsearch) and then play with the regexp after entering a slash to enter search mode.

Edit: Mark, that trick to minimise greedy matching is also covered in Dale Dougherty's excellent book "Sed & Awk" (sanitised Amazon link).

Chapter Three "Understanding Regular Expression Syntax" is an excellent intro to the more primitive regexp capabilities involved with sed and awk. Only a short read and highly recommended.

HTH

cheers,



来源:https://stackoverflow.com/questions/1305853/how-can-i-make-my-match-non-greedy-in-vim

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!