3

次のようにラテックスファイルを検索して置換したいと思います。

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

これで、「」のようなテキストが「abc \todo{def} ghi」に変換されabc def ghiます。\todo{...}コマンドが別のコマンドの内側にある場合、vimは2番目の(閉じている)括弧を外側のコマンドの括弧と一致させようとします。たとえば、「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}"
4

3 に答える 3

1

非再帰的

{} 以外のものと一致するように指示します。

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

再帰的

Vim 正規表現言語は、提案された方法でパターンを一致させるために必要な条件付き正規表現をサポートしていません。

ただし、perl などの外部言語を使用してそうすることができます。

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

再帰的正規表現のチェックアウトの詳細については、この SO 投稿を参照してください。We's Puzzling Blogも、この種の正規表現を推測するのに役立ちました。

于 2012-11-29T20:47:21.860 に答える
0

入れ子になったパターンの照合に正規表現を使用できますか? いいえ。

次のように、1 レベルのネストをサポートできます。

の中の中括弧をペアにしたい\todo{}。そのため、できるだけ多くの人と一致させる必要が[^{}]あります。{[^{}]*}

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

\(\)全体を に格納するためのエクストラを追加し\1ます。

于 2012-11-29T21:42:36.347 に答える
0

正規表現が貪欲になることは望ましくありません。回答を参照vim でマッチを非貪欲にするにはどうすればよいですか?

あなたの場合、これでうまくいくはずです:

:%s/\v\\todo\{(.{-})\}/\1/gc
于 2012-11-29T20:35:47.867 に答える