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

403

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

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

  • 0
    Я думаю, что ответ Павла хороший. Просто сказать, что "?" не означает необязательный в vim (если это то, чего вы хотите достичь с помощью "?")
  • 12
    @LB, на многих языках. *? означает соответствовать любому символу, но быть не жадным. Это то, что он пытается достичь.
Теги:
vim
regex-greedy

8 ответов

554
Лучший ответ

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

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

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

  • 1
    Если :help non-greedy не работает, попробуйте :help /\{-
  • 33
    Не очень интуитивно понятно, это делает только vim?
Показать ещё 12 комментариев
45

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

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

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

:help non-greedy
38

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

%s/style="[^"]*"//g
  • 3
    Ничего такого! Ничего плохого! :)
  • 4
    Хотя, для моей же пользы, я все же хотел бы лучше понять несносную вещь.
Показать ещё 1 комментарий
13

Если вам удобнее синтаксис 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>
  • 1
    perldo прекрасно работает, но, к сожалению, не выделяет выбранный тест при вводе регулярного выражения.
9

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

:%!sed ...

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

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

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

0

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

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

G'day,

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

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

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

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

НТН

веселит,

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню