正規表現を使用して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}これはANDのすべての項目を置き換えます\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(または同様のもの)を使用する可能性が関連している可能性があります。

これにより、+ @steeldriverのソリューションを+perl使用できます(実際には少し異なります)。:perldo

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

関連情報