regex - 如何在 Vim 中使用搜索和替换从 Latex 文件中删除命令?

标签 regex vim

我想在 latex 文件中进行搜索和替换,如下所示:

:%s/\\todo{.*}/\1/gc

这应该将“abc\todo{def} ghi”等文本转换为“abc def ghi”。当 \todo{...} 命令位于另一个命令内部时,vim 会尝试将第二个(右)括号与外部命令的括号匹配。例如,“abc\textbf{def\todo{ghi} jkl}”变成了“abc\textbf{def ghi} jkl”,而它应该是“” abc\textbf{def ghi jkl}"。

有没有办法匹配对应的括号?

编辑:

抱歉之前没有指出这一点。如果它能够与相应的括号完全匹配,那就太好了,因为 \todo{...} 命令内部和外部都可以有命令。

编辑:

"abc \todo{def \textbf{ghi} jkl}" -> "abc def \textbf{ghi} jkl"
"abc \textbf{def \todo{ghi} jkl}" -> "abc \textbf{def ghi jkl}"

最佳答案

非递归

告诉它匹配除 {} 之外的任何内容:

:%s/\\todo{\([^{}]\+\)}/\1/

递归

Vim 正则表达式语言不支持 conditional regexes这将需要按照您建议的方式匹配模式。

但是,您可以使用 Perl 等外部语言来执行此操作:

:perldo $_ =~ s/\\todo ({( (?: [^{}]*+ | (?1) )* )}) /\2/gx

有关递归正则表达式的更多信息 checkout this SO post 。我还找到了We's Puzzling Blog有助于找出这些类型的正则表达式。

关于regex - 如何在 Vim 中使用搜索和替换从 Latex 文件中删除命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13634238/

相关文章:

javascript - 使用 JavaScript 正则表达式从 url 获取用户和推文 ID

ruby - gsub(/(\d{4})\/(\d\d)\/(\d\d)\/(.*)/, '\1-\2-\3-\4' ) 是什么意思?

vim - 完全禁用 GVim 中的斜体文本

vim - 如何在vim中翻转窗口?

java - 使用正则表达式从文本文件中删除样式标签

Javascript RegEx 用于逗号分隔的文件路径列表

vim - 在 vim session 中切换到 super 用户模式

Perl 高亮引号分隔符问题 - 在哪里可以找到解决此问题的语法/perl.vim?

c++ - 如何让 vim 对齐三元组? : operator nicely?

java - IPv6 验证