破译vim正则表达式

时间:2012-05-16 11:45:21

标签: regex vim

我正在玩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. \%()做什么?它只是某种形式的分组吗?

2 个答案:

答案 0 :(得分:2)

  1. :\@!表示仅在冒号时匹配,如果我正确读取它。我不熟悉这种匹配的ruby语法,所以这可能不太正确。有关外观的更多信息,请参阅:help /\@!及其周围的主题。

  2. 您可以拥有\zs没有\ze,这只是意味着匹配的结尾位于正则表达式的末尾。反之亦然。

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

答案 1 :(得分:1)

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

  2. \zs\ze不会影响匹配的内容,而是确定匹配文本的哪一部分在函数中用作:s / substitute() 。您可以通过设置/'incsearch'选项集进行搜索来检查 - 您可以开始搜索文本中的字符串,该字符串将突出显示,然后添加\zs和{{1将更改匹配文本上的突出显示。没有必要“关闭”\ze\zs,因为人们只能丢弃比赛的开始或结束。

  3. 这是一种分组形式,不会保存在临时变量中,以便与\ze\1\2一起使用,如submatch()中所述:< / p>

    :h \%() \%(\) A pattern enclosed by escaped parentheses. Just like \(\), but without counting it as a sub-expression. This