使用正则表达式在 vim 中查找并更改某些 LaTeX 编码?

使用正则表达式在 vim 中查找并更改某些 LaTeX 编码?

如何更改以下 LaTeX 编码:

\cite{1,3-7,9} 

\cite{1,3,4,5,6,7,9}  

在维姆?我更喜欢使用正则表达式。

答案1

您可以使用 vim 的substitute命令来完成此操作:

:%s/\\cite{1,3-7,9}/\\cite{1,3,4,5,6,7,9}/g  

这将替换所有出现的\cite{1,3-7,9}\cite{1,3,4,5,6,7,9}

要仅替换当前行中存在的匹配项,您可以使用:

:s/\\cite{1,3-7,9}/\\cite{1,3,4,5,6,7,9}/g 

c如果您希望 vim 在更改任何行之前要求确认,请追加。例如:

:%s/\\cite{1,3-7,9}/\\cite{1,3,4,5,6,7,9}/gc  

答案2

m-n要扩展表达式中形式范围的任何单个实例\cite{...},您可以执行以下操作

 perl -pe 's/\\cite{(?:\d+,)*\K(\d+)-(\d+)(?=(?:,\d+)*})/sprintf "%s", join(",", ($1..$2))/e' file.tex

答案3

和我的PatternsOnText 插件,您可以将:substitute命令限制为模式匹配(\cite{...}在您的情况下):

:%SubstituteInSearch/\\cite{[^}]\+}/\(\d\+\)-\(\d\+\)/\=join(range(submatch(1),submatch(2)), ',')/g

正则表达式解析起始数字和结束数字,并使用join()和将它们转换为数字范围。range():help sub-replace-expr

答案4

Vim 通常与 Perl 链接。

在 Vim 中使用 perl (或类似的)的可能性可能是相关的。

当你有 时+perl,你可以使用:perldo+ @steeldriver 解决方案(实际上略有不同):

:perldo s/\\cite{(?:\d+,)*\K(\d+)-(\d+)(?=(,.*?)?})/sprintf "%s",join(",", $1..$2)/e

相关内容