解读 Vim 正则表达式

3

我正在使用vim-ruby-indent,其中有一些非常复杂的正则表达式:

" 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. \%() 是什么意思?只是某种形式的分组吗?
2个回答

2
  1. :\@!表示仅在没有冒号的情况下匹配,如果我理解正确的话。 我不熟悉这与ruby语法所匹配的内容,因此可能不完全正确。有关顺延查看:help/\@!和周围主题的更多信息。

  2. 您可以使用没有\ze\zs,这意味着匹配的结尾在正则表达式的末尾。反之亦然。

  3. \%(\)只创建一个分组,就像\(\)一样,但该组不可用作后向引用(例如在:substitute命令中使用)。


1
  1. 您可以通过复制正则表达式并使用/在您正在工作的代码上执行搜索来检查匹配':'或任何其他字符串的情况。使用:set incsearch可能会帮助您在输入正则表达式时查看正在匹配的内容。

  2. \zs\ze不影响匹配的内容,而是确定在函数:s/substitute()中使用哪部分匹配的文本。您可以通过设置'incsearch'选项并使用/进行搜索来检查这一点-您可以在文本中开始搜索字符串,该字符串将被突出显示,然后添加\zs\ze将更改匹配文本的突出显示。没有必要“关闭”\zs\ze,因为您可以仅丢弃匹配的开头或结尾。

  3. 它是一种分组形式,不保存在临时变量中供\1\2submatch()使用,如:h \%()所述:

    \%(\) 由转义括号括起来的模式。 与\(\)相同,但不计为子表达式。这 允许使用更多的组,并且速度稍微快一些。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接