背景
考虑以下文本:
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