2009-08-20 3 views
397

У меня есть большой файл HTML, который имеет много разметки, который выглядит так:Как я могу сделать свой матч не жадным в vim?

<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 не кажется, как ?. К сожалению, удаление ? делает матч слишком жадным.

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

+0

Я думаю, Ответ Павла хорош. Просто сказать, что "?" необязательно в vim (если это то, чего вы хотите достичь, используя «?») – LB40

+11

@LB, на многих языках. *? означает совпадение с любым персонажем, но не жадным. Это то, чего он пытается достичь. –

ответ

608

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

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

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

+1

Если ': help non-greedy' не работает, попробуйте': help/\ {- ' –

+21

Не очень интуитивно, это то, что делает только vim? –

+7

Да. У Vim есть свой язык регулярных выражений. –

40

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

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

Ничего! Ничего плохого! :) –

+3

Хотя, для моей собственной пользы, я все равно хотел бы лучше понять нерушимую вещь. –

+1

@Mark, просто добавила записку к моему ответу о превосходной главе о регулярных выражениях, которая охватывает это в книге «sed & awk» –

9

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

 
:%!sed ... 

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

+2

, но в состоянии сделать '/ pattern', чтобы проверить, что вы соответствуете шаблону правильно, прежде чем применять его, и с помощью модификатора 'c' в вашем vim регулярном выражении тоже приятно :) –

+0

это правильно. все решения здесь не близки к не-жадным! если вам нужно сопоставить [0-9] \ {7} в строке с большим количеством текста и несколькими вхождениями этого шаблона, здесь не будет никакого решения. Решения здесь работают только на простые вещи (что справедливо, это то, что было задано). но если вы делаете немного больше, чем поиск до следующей цитаты, vim не поможет. – gcb

-2

G'day,

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

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

Edit: Марк, что трюк, чтобы свести к минимуму жадные соответствия также охватывается в превосходной книге Дейл Доэрти в «Sed & Awk» (sanitised Amazon link).

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

НТН

веселит,

+6

Обработка регулярного выражения Vim на самом деле довольно приятная. Он может делать то, что sed не может, например, сопоставление номеров строк и столбцов или совпадение, основанное на классификации языков на языке, в качестве ключевых слов или идентификаторов или пробелов. Он также имеет утверждения с нулевой шириной и возможность размещения выражений в правой части замены. Если вы используете '\ v', это помогает очистить синтаксис. –

+0

@Brian, приветствия. Я сделаю вспомогательное regex и посмотрю, чего не хватает. –

45

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

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

просто попробовать:

:help non-greedy 
13

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

  1. поддерживает нежадным оператора, как вы просили в ОП ; и
  2. не требует возврата операторов группировки и мощности (совершенно противоречивое требование синтаксиса vim, поскольку вы не отвечаете буквальным символам, но указываете операторы); и
  3. вы [г] ВИМ скомпилирован с PERL функции, тест с использованием

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

поиска Try/замену с использованием

:perldo s/// 

Примера. Своп ГКЗ и альт атрибутов в 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> 
1

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

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

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