2016-06-16 9 views
0

はそうのような文字列があるとします。この中`[a-zA-Z] *`が先頭の空白を含む単語と一致しないのはなぜですか?

aWordToRemove; 

電源を入れ、それを:私はコマンド:s/[a-zA-Z]*/TEST/を実行した場合

TEST; 

が、それは何も一致していません。

:s/[a-zA-Z]\w*/TEST/を実行すると、aWordToRemoveTESTに置き換えられ、先頭の空白と末尾のセミコロンがそのまま残ります。

先頭の空白がある場合、最初の正規表現で単語が見つからないのはなぜですか?

\w*の直前に置くのはなぜですか?

EDIT:

Vimに細心の注意のようです。ここでは、動作している正規表現と動作していない正規表現のいくつかを示します。

ワーキング正規表現

s/[a-zA-Z]\w*/TEST/

s/[a-zA-Z][a-zA-Z]*/TEST/

s/[a-zA-Z]\+/TEST/

が動作しない正規表現

s/[a-zA-Z]*/TEST/

s/[a-zA-Z]+/TEST/

+2

グローバル修飾子が必要なためです。あるいは、 '*'の代わりに '+'を使うのが良いでしょう。そうでなければ、パターンは最初に一致します。 –

+2

必要なパターンは 's/[a-zA-Z] \ +/TEST /'です。 – 4castle

+0

バックスラッシュが必要な理由は分かりますか? – ncphillips

答えて

6

それはラインの開始と第一の空間との間に空の文字列を検索し、空の文字列に置き換え、その後、停止しているため。

代わりに:s/[a-zA-Z]*//gを試すと、最初の交換後に試してみることができます。

クレーンクロージャ(*)は、何も一致することはありません。あなたのような同様の式は:s/[a-zA-Z][a-zA-Z]*//です。少なくとも1文字は一致していて、最初の空の文字列と一致するとその文字が停止するのを防ぎます。事実、これは非常に一般的なことであり、オペレータa+はほとんどの正規表現の方言ではaa*の省略形です。

:s/[a-zA-Z]\w*//がこれを動作させる理由は、それ以上の文字を消費する前に少なくとも1文字一致する必要があるためです。

+1

または '*'を '+' –

+1

'に変更してください:s/[a-zA-Z] [a-zA-Z] * //' == ':s/[a-zA-Z] +// ' –

+0

奇妙な' + 'が動作しません – ncphillips

3

vimregexを学ぶには、まずmagicvery magicおよびno magicを学ぶ必要があります。 :h magic詳細をご覧ください。

Vimにはデフォルトでmagicが設定されています。 magicはBRE -です。つまり、特殊な意味を与えるためにいくつかの文字をエスケープする必要があります。そうでない場合は、そのままリテラルの文字になります。like () | + ...この点については、BREと同じです。

あなたが正規表現EREやPCRE を作りたい場合、あなたはこのように、あなたのパターンの前\vを置くことができます::s/\v[...]+/whatever/gは動作します。このvery magicモードでは、リテラル値を持つために特別な意味を持つ文字をエスケープする必要があります。

私はあなたがvim magicのドキュメントを読むことをお勧めします、異なるマジックモードを比較するためのテーブルがあります。そして、いくつかのテストを行うことができます。

関連する問題