Regex 对vim中捕获组的反向引用
在某些文本中,我需要找到一个字符串,该字符串可能是以下字符串之一Regex 对vim中捕获组的反向引用,regex,vim,matching,backreference,Regex,Vim,Matching,Backreference,在某些文本中,我需要找到一个字符串,该字符串可能是以下字符串之一 foo#foo%foo foo#foo%bar foo#bar%foo foo#bar%bar bar#foo%foo bar#foo%bar bar#bar%foo bar#bar%bar 我可以这样写正则表达式匹配器 /\(foo\|bar\)#\(foo\|bar\)%\(foo\|bar\) 这很好用 但是我想避免在matcher中捕获组的重复 如果我写了这样的东西 /\(foo\|bar\)#\1%\1 它只匹配我
foo#foo%foo
foo#foo%bar
foo#bar%foo
foo#bar%bar
bar#foo%foo
bar#foo%bar
bar#bar%foo
bar#bar%bar
我可以这样写正则表达式匹配器
/\(foo\|bar\)#\(foo\|bar\)%\(foo\|bar\)
这很好用
但是我想避免在matcher中捕获组的重复
如果我写了这样的东西
/\(foo\|bar\)#\1%\1
它只匹配我在开头提到的第一个和最后一个可能的字符串
问:我可以参考之前的捕获组本身,而不是之前的匹配吗?我完全不想创建和重用子模式,并像@Amadan和@lcd047那样重用它们,但是Vim不支持我所知道的这种行为 或者,您可以在编辑模式时使用
打开命令行窗口
。在此窗口内,您可以使用常规Vim命令编辑图案,例如daw
,ct)
等。完成后,您可以按
并运行搜索/命令
关于这一点,有一个很好的插曲:
有关更多帮助,请参阅:
:h command-line-window
:h q/
:h c_Ctrl-f
不,regexp不是这样工作的。@lcd047:有许多regexp方言。这不是Vim regexp的工作方式。您可以在Oniguruma(Ruby的regexp引擎)中实现这一点,例如()@Amadan,您也可以使用它,可能还有许多其他工具。然而,我相信OP的问题是关于Vim的。这篇文章的标题中提到了Vim,这让人很难错过。从我的回答中是否有任何特殊原因可以推断我指的是Vim regexps以外的任何东西?@lcd047:没有。但是也没有任何特殊原因可以阻止推断您指的是任何地方的所有regexp;这并不是一个很大的延伸,因为直到最近还没有正则表达式引擎能够做到这一点,而在理论正则表达式中,它只是一个外来的概念。我只是想澄清一下,可能的读者对regexp的了解可能没有你那么多。是的,命令行窗口是一个非常有用的特性,应该经常提到它。在旁注中,
q?
打开相同的窗口进行向后搜索,q:
打开类似的窗口进行编辑Ex命令。