首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >破译vim正则表达式

破译vim正则表达式
EN

Stack Overflow用户
提问于 2012-05-16 11:45:20
回答 2查看 259关注 0票数 3

我在玩vim-ruby缩进游戏,那里有一些非常复杂的规则:

代码语言:javascript
复制
" 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文档的帮助下,我破译了它的意思:

代码语言:javascript
复制
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. 真的与“:”匹配吗?似乎不是这样的,但是我没有看到冒号在regexes中是一个特殊的字符。
  2. 为什么有\zs (比赛开始)而没有\ze (比赛结束)?
  3. 做什么\%()?这只是某种形式的分组吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-16 12:32:53

  1. :\@!说,只有在没有冒号的情况下,如果我正确阅读,才能匹配。我不熟悉与之匹配的ruby语法,因此这可能不太正确。有关lookarounds.
  2. You的更多信息,请参见:help /\@!和周围的主题,它可以有一个没有\ze\zs,这只是意味着匹配的结束在正则表达式的末尾。相反,true.
  3. \%(\)只创建一个分组,就像\(\)一样,只是这个组不能作为反向引用使用(就像在:substitute命令中一样)。
票数 2
EN

Stack Overflow用户

发布于 2012-05-16 12:34:32

  1. ,您可以通过复制正则表达式来检查匹配的“:”或任何其他字符串,并使用它对正在运行的代码执行/搜索。使用:set incsearch可以帮助您在键入正则表达式时查看匹配的内容。
  2. \zs\ze不影响匹配内容,而是确定匹配文本的哪一部分用于:s/substitute()等函数。您可以通过使用/'incsearch'选项集执行搜索来检查--您可以开始搜索文本中的字符串,该字符串将被高亮显示,然后添加\zs\ze将更改匹配文本的突出显示。没有必要“关闭”\zs\ze,因为人们只能放弃比赛的开始或结束。
  3. 是一种分组形式,没有保存在临时变量中,以便与\1\2submatch()一起使用,如:h \%()中所述:

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10617814

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档