2012-07-17 104 views
1

我不明白为什么,如果考虑到以下行(VI与设定列表)正则表达式非贪婪匹配制表符

10.0.6.5^IVirtual^IVmware^IHTTP, MS SQL, Windows SVC^IcpHelpdesk $ 

为什么下面的正则表达式:

^I.*?^I 

不匹配字符串'虚拟'在我上面的行?我使用正则表达式低于我的VI搜索和替换

:%s/^I.*?^I/replace/g 

然而,这没有返回比赛在同一个字符串,如果我用

^I.*^I 

我会得到

10.0.6.5replaceIcpHelpdesk $ 

我试图说与^I.*?^I是从第一个制表符(^I)匹配任何东西(除了换行符之外的点)零次或多次(*?)un直到你来到下一个标记与是制表符(^I

我没有看到我失踪和任何帮助,将不胜感激。谢谢

+2

在大多数的正则表达式语言'^'意味着开始字符串和'\ t'将是一个制表符。 – OrangeDog 2012-07-17 19:58:02

+0

你正在使用什么程序作为正则表达式引擎? – amon 2012-07-17 19:58:09

+0

这个例子是一个多行字符串,还是它有文字'^'? – 2012-07-17 20:03:37

回答

1

你在说vim regex吗?在这种情况下,非贪婪量词是\{-}

\t.\{-}\t 

否则,您可以通过不具有否定组匹配制表符做到这一点:

\t[^\t]*\t 
+1

Thor - 非常感谢你指的是vim正则表达式,并不知道有一个不同的非贪婪量词。有时间在我的最后做一些阅读。再次感谢 – vloche 2012-07-17 20:20:29

+0

如果您熟悉Python的正则表达式系统(这与Perl的系统并没有什么不同),那么围绕vim的正则表达式系统应该不难。 http://vimregex.com/是一个很好的开始。对于随后无法识别的任何符号,请在vim的本机帮助文件中搜索它们,以填补剩余的大部分空白。对我来说,这是他们没有解释的非匹配组符号,所以我做了'''h:\%('''并得到了我的答案 – SeldomNeedy 2015-03-20 17:44:35