vimでhtmlタグを置き換えたいのですが、見つけた内容を再利用したいです。つまり、交換したいのです。
<div class="subSectionTitle">
Title 1
</div>
そして
<h1>
Title 1
<h1>
試してみましたが、s/pattern/replacement/
なぜか文字列は挿入されません。走った後
:%s/<div class="subSectionTitle">\_.\{-}<\/div>/<h1>\1<\/h1>/g
ただ取得
<h1></h1>
vimでワイルドカードがどのように機能するのか、そしてこれが\1
私が望むテキストではない理由を説明できる人はいますか?
答え1
- 一般文字のみが一致
.
し、改行文字は一致しません。 HTMLタグは複数行にまたがるため、一致するものはありません。代わりに原子を使用してください\_.
(:help /\_.
)。 \1
交換内部テキストを参照しましたが、実際にはそうではありませんでした。捕獲それ。これを行うには、以下を添付してください\(...\)
。- これ貪欲マッチを通して
*
マッチします。最初スタートタグと最後終了タグ、キャプチャグループの他のタグは無視されるため、これは単一の発生に対してのみ機能します。変化みんな発生、使用欲はない*
で置き換えて一致させます\{-}
。 (または2番目のオプションを使用してください。)
:%s/<div class="subSectionTitle">\(\_.\{-}\)<\/div>/<h1>\1<\/h1>/g
あるいは、開いたタグと閉じるタグを別々に一致させることもできます。 (とにかくネストされたタグの場合、元の単一の一致であっても対応する閉じるタグを置き換えることはできません。)開いたタグと閉じるタグの異なる先頭をキャプチャする代わりに、実際には特別な開いたタグを使用して一致させます。/\zs
原子。
:%s/<\zsdiv class="subSectionTitle">\|<\/zsdiv>/h1>/g