我正在玩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> ...
我有些疑惑:
\zs
(比赛开始)而没有\ze
(比赛结束)? 答案 0 :(得分:2)
:\@!
表示仅在不冒号时匹配,如果我正确读取它。我不熟悉这种匹配的ruby语法,所以这可能不太正确。有关外观的更多信息,请参阅:help /\@!
及其周围的主题。
您可以拥有\zs
没有\ze
,这只是意味着匹配的结尾位于正则表达式的末尾。反之亦然。
\%(\)
只是创建一个分组,就像\(\)
一样,只是该组不可用作反向引用(就像在:substitute
命令中使用的那样)。
答案 1 :(得分:1)
您可以通过复制正则表达式来检查匹配':'或任何其他字符串,并使用它来对您正在使用的代码执行/
搜索。使用:set incsearch
可以帮助您在键入正则表达式时查看匹配的内容。
\zs
和\ze
不会影响匹配的内容,而是确定匹配文本的哪一部分在函数中用作:s
/ substitute()
。您可以通过设置/
和'incsearch'
选项集进行搜索来检查 - 您可以开始搜索文本中的字符串,该字符串将突出显示,然后添加\zs
和{{1将更改匹配文本上的突出显示。没有必要“关闭”\ze
和\zs
,因为人们只能丢弃比赛的开始或结束。
这是一种分组形式,不会保存在临时变量中,以便与\ze
,\1
或\2
一起使用,如submatch()
中所述:< / p>
:h \%()
\%(\) A pattern enclosed by escaped parentheses.
Just like \(\), but without counting it as a sub-expression. This