Как я могу сделать свой матч не жадным в vim?


у меня есть большой HTML-файл, который имеет много разметку, которая выглядит так:

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

Я пытаюсь сделать поиск и замена в Vim, чтобы избавиться от всех class="" и style="" но у меня возникли проблемы с тем, чтобы сделать матч нескладным.

моя первая попытка была такой

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

но Вим, кажется, не нравится ?. К сожалению, удаление ? делает матч слишком жадные.

как я могу сделать мои нежадные матч?

8 430

8 ответов:

вместо .* использовать .\{-}.

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

кроме того, см. :help non-greedy

не жадный поиск в vim выполняется с помощью оператора { -}. Вот так:

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

попробуй:

:help non-greedy

что с

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

Если вам удобнее синтаксис регулярных выражений PCRE, который

  1. поддерживает не-жадный оператор ? как вы просили в ОП; и
  2. не требует группирования backwhacking и операторов мощности (совершенно нелогичное требование синтаксиса vim, поскольку вы не сопоставляете литеральные символы, но указываете операторы); и
  3. у вас есть [g]vim, скомпилированный с функцией perl, тест с использованием

    :ver и проверьте функции; если +perl есть ты хорошо идешь)

попробуйте найти / заменить с помощью

:perldo s///

пример. Замените src и Alt атрибуты в теге img:

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

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

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

Я обнаружил, что хорошим решением этого типа вопроса является:

:%!sed ...

(или Perl, если вы предпочитаете). IOW, вместо того, чтобы изучать особенности регулярных выражений vim, используйте инструмент, который вы уже знаете. Использование perl сделает это ? модификатор работает, чтобы ungreedy матч.

С \v (как предложено в нескольких комментариях)

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

плагин eregex.ВИМ обрабатывает не жадные операторы в стиле Perl *? и +?

Добрый день,

обработка регулярных выражений Vim не слишком блестящая. Я обнаружил, что синтаксис регулярных выражений для sed примерно соответствует возможностям vim.

Я обычно устанавливаю подсветку поиска (: set hlsearch), а затем играю с регулярным выражением после ввода косой черты, чтобы войти в режим поиска.

Edit: Марк, этот трюк для минимизации жадного соответствия также описан в превосходной книге Дейла Догерти "Sed & Awk" (продезинфицировать Амазонки ссылка).

Глава третья "понимание синтаксиса регулярных выражений" - отличное введение в более примитивные возможности регулярных выражений, связанные с sed и awk. Только короткое чтение и настоятельно рекомендуется.

HTH

спасибо,