3

私はvim-rubyインデントで遊んでいますが、かなり複雑な正規表現がいくつかあります。

" Regex used for words that, at the start of a line, add a level of indent.
let s:ruby_indent_keywords = '^\s*\zs\<\%(module\|class\|def\|if\|for' .   
      \ '\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure' . 
      \ '\|rescue\):\@!\>' .                                               
      \ '\|\%([=,*/%+-]\|<<\|>>\|:\s\)\s*\zs' .                            
      \    '\<\%(if\|for\|while\|until\|case\|unless\|begin\):\@!\>'     

vimのドキュメントの助けを借りて、私はそれを次のように解読しました:

start-of-line <any number of spaces> <start matching> <beginning of a word> /atom
<one of provided keywords> <colon character> <nothing> <end of word> ...

私はいくつかの疑問があります:

  1. ':'と本当に一致していますか?そのようには機能しないようですが、コロンが正規表現の特殊文字であるということについては何もわかりません。
  2. なぜ\zs(試合の開始)とない\ze(試合の終了)があるのですか?
  3. \%()は何をしますか?それは単なるグループ化の形式ですか?
4

2 に答える 2

2
  1. :\@!私が正しく読んだ場合、コロンがない場合にのみ一致すると言われています。これが照合されるルビ構文に精通していないため、これは完全に正しくない可能性があります。:help /\@!ルックアラウンドの詳細については、 および周辺のトピックを参照してください。

  2. \zsnoを持つことができます\ze。これは、一致の終わりが正規表現の終わりにあることを意味します。その逆もまた真です。

  3. \%(\)グループが後方参照として使用できないことを除いて、同じようにグループ化を作成するだけです(コマンド\(\)で使用されるように)。:substitute

于 2012-05-16T12:32:53.387 に答える
1
  1. /正規表現をコピーし、それを使用して作業中のコードで検索を実行することにより、一致する「:」またはその他の文字列を確認できます。を使用:set incsearchすると、正規表現を入力するときに何が一致しているかを確認するのに役立つ場合があります。

  2. とは一致するものには影響\zs\zeませんが、代わりに、一致したテキストのどの部分が:s/として関数で使用されるかを決定しますsubstitute()/オプションセットを使用して検索を実行することで確認でき'incsearch'ます。テキスト内の文字列の検索を開始して強調表示し、次に追加\zs\zeて、一致したテキストの強調表示を変更します。試合の開始または終了のみを破棄できるため、\zs「閉じる」必要はありません。\ze

  3. \1これは、次のように、、\2またはsubmatch()で使用するために一時変数に保存されないグループ化の形式です:h \%()

    \%(\) A pattern enclosed by escaped parentheses. Just like \(\), but without counting it as a sub-expression. This allows using more groups and it's a little bit faster.

于 2012-05-16T12:34:32.760 に答える