webdevqa.jp.net

Vim:他の単語が続かない単語を検索するにはどうすればよいですか?

かなり基本的な質問です。_"abc "_で始まり、その後に_"defg"_以外のフレーズが続くフレーズに一致するように、Vimで正規表現を書き込もうとしています。

_"[^defg]"_を使用して、d、e、f、またはg以外の任意の1文字に一致させました。

私の最初の本能は/abc [^\(defg\)]または_/abc [^\<defg\>]_を試すことでしたが、どちらも機能しません。

38

これが検索文字列です。

/abc \(defg\)\@!

あなたが探している概念は、否定的な先読みアサーションと呼ばれます。詳細については、vimでこれを試してください:

:help \@!
49
bmdhacks

前または後に?

'abc'で始まり、(すぐに)その後に 'defg'が続かないものであれば、 bmdhacks'solution が必要です。

'abc'で始まり、(すぐに) 'defg'が先行しないものである場合は、ネガティブな後読みが必要です。

/\%(defg\)\@<!abc /

これは、「defgabc」の一部でない限り、「abc」の出現と一致します。詳細については、:help \@<!を参照してください。

'defg。* abc'の一部でない限り、 'abc'と一致させたい場合は、.*を追加するだけです。

/\%(defg.*\)\@<!abc /

'defg'が発生しない行でのみ 'abc'を照合することも同様です。

/\%(defg.*\)\@<!abc \%(.*defg\)\@!/

ただし、これを置換のためだけに行う場合は、:v//:s//を組み合わせることでこれを簡単に行うことができます。

:%v/defg/s/abc /<whatever>/g

これにより、「defg」を含まないすべての行で「abc」の代わりに「<whatever>」が使用されます。詳細については、:help :vを参照してください。

15
rampion

さあ、これは毛深いものです:

/\%(\%(.\{-}\)\@<=XXXXXX\zs\)*

(XXXXXXを検索ワードに置き換えます)。これは、XXXXXXを含むnotを行うすべてのものを検索します。あなたがした場合、私は想像します:

/abc \%(\%(.\{-}\)\@<=defg\zs\)*

これはあなたが望むように働くかもしれません。これが少し役立つことを願っています!

0
Lee H