5

Фон

Рассмотрим следующий текст:

There are three types of font families: serif, sans serif, and
teletype.  To switch between these families, use <cmd>rm</cmd> for
serif, <cmd>ss</cmd> for sans serif, and <cmd>tt</cmd> for teletype.

Я хотел бы изменить <cmd>x</cmd> на {{cmd|x}} следующим образом:

There are three types of font families: serif, sans serif, and
teletype.  To switch between these families, use {{cmd|rm}} for
serif, {{cmd|ss}} for sans serif, and {{cmd|tt}} for teletype.

проблема

Регулярное выражение для не жадных совпадений сложно. Например, следующее не работает в vim:

:%s/<cmd>\(.*\)<\/cmd>.\{-}/{{cmd|\1}}/

Также, как и в случае с sed:

sed -e "/(<cmd>\(.*\)</cmd>).\{-}/{{cmd|\1}}/"

Круглые скобки пытаются сопоставить круглые скобки, а не группировать выражение для применения не жадного оператора: \{-} или ? , Экранирование скобок используется для обратных ссылок, что требуется только для текстового содержимого внутри <cmd> .

Вопрос

Каков правильный синтаксис для не жадной замены всех вхождений <cmd>x</cmd> на {{cmd|x}} в файле?

Примечание. Это не попытка разобрать HTML с помощью регулярных выражений. ;-)

1 ответ1

5

Я пробовал это в VIM: %s/<cmd>\(.\{-}\)<\/cmd>/{{cmd|\1}}/g , и он конвертирует ваш демонстрационный текст в:

There are three types of font families: serif, sans serif, and
teletype.  To switch between these families, use {{cmd|rm}} for
serif, {{cmd|ss}} for sans serif, and {{cmd|tt}} for teletype.

Кажется, ваше первое регулярное выражение в VIM действительно близко к решению вашей головоломки, но использование .\{-} не в том месте.

Я получил подсказку из этого ответа: https://stackoverflow.com/questions/1305853/how-can-i-make-my-match-non-greedy-in-vim

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .