web-dev-qa-db-ja.com

Vim正規表現の後方参照

私はこれをしたい:

_%s/shop_(*)/shop_\1 wp_\1/
_

shop_(*)が何にも一致しないのはなぜですか?

56
nnyby

ここにはいくつかの問題があります。

  1. vim regexenの括弧はキャプチャ用ではありません。キャプチャには\( \)を使用する必要があります。

  2. _*_はあなたが思うことを意味しません。これは「前の0個以上」を意味するため、正規表現は「_shop__の後に0+ _(_とリテラル__)_が続く文字列」を意味します。
    探しているのは_._です。正規表現では「任意の文字」を意味します。 _.*_のように星と組み合わせると、「任意の文字が0個以上」という意味になります。おそらく少なくとも1文字が必要なので、_.\+_を使用します(_+_は「前の1つ以上」を意味します)

これを使用してください:%s/shop_\(.\+\)/shop_\1 wp_\1/

オプションで、最後のスラッシュの後にgで終了して、最初の行だけでなく1行のすべてのインスタンスを置き換えます。

67
Daenyth