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. :\@!说只有在没有冒号的情况下才匹配,如果我没看错的话。我不熟悉与之匹配的 ruby​​ 语法,因此这可能不太正确。有关环视的更多信息,请参阅:help /\@!和周边主题。

  2. 你可以有 a \zswith no \ze,它只是意味着匹配的结尾是在正则表达式的结尾。反之亦然。

  3. \%(\)就像创建一个分组一样,\(\)只是该组不能用作反向引用(就像在:substitute命令中使用一样)。

于 2012-05-16T12:32:53.387 回答
1
  1. 您可以通过复制正则表达式并使用它对/您正在工作的代码执行搜索来检查匹配的“:”或任何其他字符串。使用:set incsearch可以帮助您在键入正则表达式时查看匹配的内容。

  2. 和不影响匹配的内容\zs\ze而是确定匹配文本的哪一部分在函数中用作:s/ substitute()。您可以通过使用/'incsearch'选项集执行搜索来检查 - 您可以开始搜索文本中的字符串,该字符串将突出显示,然后添加\zs\ze更改匹配文本的突出显示。没有必要“关闭” \zsand \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 回答