背景

背景

背景

考虑以下文本:

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>with的正确语法是什么?{{cmd|x}}

注意:这不是尝试使用正则表达式解析 HTML。;-)

答案1

我在 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

相关内容