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