Як я можу зробити свій матч не жадібним у vim?


479

У мене великий 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=""але у мене виникають проблеми , роблячи матч ungreedy.

Моєю першою спробою було це

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

але Vim, схоже, не подобається ?. На жаль, вилучення ?робить матч занадто жадібним.

Як я можу зробити свій матч невірним?


Я думаю, що відповідь Поля хороша. Просто сказати, що "?" не означає необов’язковий vim (якщо це те, чого ви хочете досягти, використовуючи "?")
LB40

14
@ LB, багатьма мовами. *? означає відповідати будь-якому персонажу, але бути не жадібним. Саме цього він і намагається досягти.
Ренді Морріс

Відповіді:


734

Замість .*використання .\{-}.

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

Також див :help non-greedy


37
Не дуже інтуїтивно, це щось, що робить тільки vim?
Ehtesh Choudhury

94
У всіх є своя мова регулярного вираження ... це одна з найбільших проблем з регулярними виразами.
Патрік Фаррелл

35
Багато цих інструментів визрівали приблизно в один і той же час і незалежно розробили власний діалект мови регулярного висловлювання. Багато з цих інструментів також намагалися вирішити різні проблеми, тому має сенс, що синтаксис може бути -потенційно диким - різним у цих реалізаціях. Ми маємо погодитись, що саме так працює реальний світ, хоча іноді це ускладнює наше життя розробникам. На щастя, багато інструментів принаймні забезпечують сумісну з Perl реалізацію регулярного виразів. На жаль, Вім не з них.
Ренді Морріс

15
Якщо хтось, як я, за замовчуванням шукає \v(дуже чарівний прапор), який ви хочете використовувати .{-}.
jgillman

48
@Shurane @Ziggy Mnemonic: контролює кількість повторень, як {1,3}це робиться (брекети). Знак мінус -означає: повторіть якомога менше (мало == мінус);)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

58

Пошук, який не жадібний у програмі vim, здійснюється за допомогою оператора {-}. Подобається це:

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

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

:help non-greedy


17

Якщо вам зручніше синтаксис регексу PCRE, який

  1. підтримує не жадібного оператора?, як ви просили в ОП; і
  2. не вимагає зворотного переключення операторів групування та кардинальності (абсолютно контрінтуїтивна синтаксис 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=".*?")/$2 $1/

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

1
perldoпрацює чудово, але, на жаль, не підкреслює вибраний тест під час введення регексу.
mljrg

12

Я виявив, що хорошим рішенням такого типу питань є:

:%! sed ...

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


2
хороший момент, але бути в змозі /patternперевірити, чи правильно ви узгоджуєте шаблон, перш ніж застосовувати його та використовувати cмодифікатор у своєму vim регулярному виразі також приємно :)
Жоао Портела

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

4

З \v(як пропонується в кількох коментарях)

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

2

Плагін eregex.vim обробляє не жадібні оператори стилю Perl *?та+?


@xsilenT github.com/othree/eregex.vim : "Рекомендується встановлювати скрипт за допомогою Vundle або збудника."
eXe

вибачте за те, що я не знаю, як використовувати Vundle або збудник.
xsilen T

-4

День,

Обробка зворотного гекса Vim не надто геніальна. Я виявив, що синтаксис regexp для sed приблизно відповідає правильності можливостей vim.

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

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

Третій розділ "Розуміння синтаксису регулярного вираження" є чудовим ознайомленням з більш примітивними можливостями регулярного вираження, пов'язаними з sed і awk. Лише коротке читання і дуже рекомендується.

HTH

ура,


7
Обробка регексу Vim насправді дуже приємна. Він може робити те, що sed не може, наприклад, збігатися за номерами рядків / стовпців або збігатися на основі мовної класифікації символів як ключових слів, або ідентифікаторів чи пробілів. Він також має твердження нульової ширини та можливість розміщувати вирази в правій частині заміни. Якщо ви користуєтесь, \vце допомагає багато очистити синтаксис.
Брайан Карпер

1
@Brian, ура. Я зроблю довідковий регекс і побачу, чого я пропустив.
Роб Веллс

@RobWells, Sed & Awk , що справді є дуже хорошим книгою, не витрачає явно жодних слів на жадібні / ледачі квантори. В якості доказу, що немає абсолютно ніякого виникнення слів жадібності або жодного в книзі, і є тільки один, але не пов'язаний, поява слова ледачого .
Енріко Марія Де Анджеліс

@EnricoMariaDeAngelis це, але приклад не посилається на термін прямо. Йдеться про те, як налаштувати ваш регулярний вираз, щоб використовувати оператор "не" для досягнення не жадібних матчів. Термін жадібний і ледачий прийшов разом із двигуном NFA Perl, коли вони представили операторів, щоб спеціально модифікувати поведінку жадної відповідності.
Роб Уеллс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.