2016-04-26 7 views
2

私は、SQLの予約語の任意のセットを大文字にするためのマクロをまとめてみました。Vimは正規表現の文字制限を持っていますか?

:nnoremap <leader>c :s/\(\<use\>\)\|\(\<create\>\)\|\(\<select\>\)\|\(\<update\>\)\|\(\<delete\>\)\|\(\<not\>\)\|\(\<null\>\)\|\(\<unique\>\)\|\(\<constraint\>\)\|\(\<references\>\)\|\(\<join\>\)\|\(\<on\>\)\|\(\<inner\>\)\|\(\<outer\>\)\|\(\<left\>\)\|\(\<group\>\)\|\(\<order\>\)\|\(\<having\>\)\|\(\<by\>\)/\U&/g<CR> 

マクロは私の.vimrcに書き込まれます。これは正常に読み込まれます。私の周りに検索してきた

E872: (NFA regexp) Too many '(' 
E51: Too many \(
E476: Invalid command 

が、正規表現には限界があることを示すためには何も見つかりませんでした。しかし、私はマクロVimはいくつかのエラーを吐く実行したとき。エラーで私の最高の読んだことは、私が何かを正しく脱出できなかったことですが、私はそれを見つけることができません。

ここで正規表現の制限を超えましたか?

答えて

1

これは正規表現の文字数の制限ではなく、正規表現のグループ数の制限です。

Vimは最大10個の正規表現グループ(\0....\9)を処理できますが、私はあなたのコードを数えませんでしたが、あなたの正規表現には10個以上のグループがあるはずです。

(10)の定数はregexp.h

https://github.com/vim/vim/blob/0b9e4d1224522791c0dbbd45742cbd688be823f3/src/regexp.h#L22

で定義されていた、それはここのように、ユーザーの正規表現を検証するために使用されました:

https://github.com/vim/vim/blob/af98a49dd0ef1661b4998f118151fddbf6e4df75/src/regexp.c#L1539

+0

、 10分の1は\ 0です。これはマッチ全体を表します。 OPの正規表現はとにかくグループ化する必要はなく、大括弧を削除するだけでうまくいきます。 –

+0

@EndreBothコメントをいただきありがとうございます。私は、さまざまな角度から質問をしていると思う。私は "なぜこのエラーメッセージを持っているのですか"や "正規表現にある制限を超えましたか?"しかし、あなたは絶対に正しいです、OPの正規表現を最適化する大きなスペースがあります。 – Kent

+0

ああ!私はパイプでグループ分けが必要でないことに気づいていませんでした。ケント、情報のおかげで - グループ分けに限界があることを知っておいてよかった。 –

0

あなただけのキャプチャパターンを持つことができます\ 1 .. \ 9。あなたはより多くのグループ化を必要とするが、それらのすべてをキャプチャする必要がない場合は、\%(pattern\)構文で非キャプチャグループを使用することができます:あなたは(\ 9に\ 1)までの9グループを持つことができます

/abc\%(def\)ghi/ 
関連する問題