8

このテキストでは、vim 7.2 を使用します。

foo fooトークンfoo fooカウンタートークン foo fooトークンfooターゲットfoo fooカウンタートークンfoo

「トークン」で始まり、「カウンタートークン」を含まない「ターゲット」で終わる各文字列を一致させたいと考えています。

したがって、上記の例では、次のように一致させたいと考えています。

foo foo トークン foo foo カウンタートークン foo fooトークン foo ターゲットfoo foo カウンタートークン foo

しかし、これではありません

foo fooトークン foo foo カウンタートークン foo fooトークン foo ターゲットfoo foo カウンタートークン foo

(この理由は、実際には、長いファイルを検索していて、「ターゲット」の前の最後の「トークン」に関心があるためです。トークンは XML タグに少し似ていますが、XML ではないため、XMLツールは役に立ちません.カーソルが「ターゲット」に着地し、「トークン」を逆方向に検索できるように使用できることは知って\zsいますが、確かにワンステップの解決策があります!)

私はこのようなものがうまくいくことを望んでいましたが、うまくいきません:

/token\(.*countertoken.*\)\@!*target

私が興味を持っているそのような出現はたくさんあります。もちろん、私が検索しているファイルは、「foo」ほど規則的なものでいっぱいではありません。

vimでこれのための1行の正規表現はありますか?

4

1 に答える 1

1

最後の のみに関心がある場合はtoken、 を気にする必要はありませんcountertoken。1 つの可能性は、 の最後の発生を探しtoken、次の まですべてを照合することtargetです。

/.*\zs\(token\).\{-}\(target\)

説明:

  • .*\zs- 最後の一致。
  • \(token\)- 文字列「token」に一致
  • .\{-}非貪欲に一致
  • \(target\)- 文字列「ターゲット」に一致
于 2012-12-14T09:36:13.820 に答える