Как я могу сделать свой матч не жадным в 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

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

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

Ответ 1

Вместо .* используйте .\{-}.

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

Также см. :help non-greedy

Ответ 2

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

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

просто попробуйте:

:help non-greedy

Ответ 3

Что случилось с

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

Ответ 4

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

  • поддерживает неживой оператор?, как вы просили в OP; и
  • не требует возврата операторов группировки и мощности (совершенно противоречивое требование синтаксиса vim, поскольку вы не отвечаете буквальным символам, но указываете операторы); и
  • у вас есть [g] vim, скомпилированный с функцией perl, с помощью

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

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

:perldo s///

Пример. Swap 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=".*?")/$2 $1/

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

Ответ 5

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

:%!sed ...

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

Ответ 6

Плагин eregex.vim обрабатывает нежелательные операторы в стиле Perl *? и +?

Ответ 7

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

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

Ответ 8

G'day,

Обработка regexp Vim не слишком блестящая. Я обнаружил, что синтаксис regexp для sed - это правильное совпадение возможностей vim.

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

Изменить: Отметить, этот трюк, чтобы свести к минимуму жадное соответствие, также рассматривается в Дейл Догерти, отличная книга "Sed and Awk" (санированная ссылка Amazon).

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

НТН

веселит,