Как я могу сделать мой матч не жадным в VIM? - PullRequest
458 голосов
/ 20 августа 2009

У меня большой 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, похоже, не нравится ?. К сожалению, удаление ? делает совпадение слишком жадным.

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

Ответы [ 8 ]

703 голосов
/ 20 августа 2009

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

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

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

54 голосов
/ 20 августа 2009

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

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

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

:help non-greedy
47 голосов
/ 20 августа 2009

Что не так с

%s/style="[^"]*"//g
15 голосов
/ 20 ноября 2012

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

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

    : версия и проверка функций; если есть + 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=".*?")/$2 $1/

<p class="logo"><a href="/"><img alt="" src="/caminoglobal_en/includes/themes/camino/images/header_logo.png"></a></p>
11 голосов
/ 20 августа 2009

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

:%!sed ...

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

1 голос
/ 09 ноября 2016

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

1 голос
/ 29 сентября 2015

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

:%s/\v(style|class)\=".{-}"//g
0 голосов
/ 20 августа 2009

G'day,

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

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

Редактировать: Отметьте, что этот трюк для минимизации жадного совпадения также описан в превосходной книге Дейла Догерти "Sed & Awk" ( очищенная ссылка Amazon ).

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

НТН

ура

...