“。*”和“。*?”之间有什么区别?

时间:2018-05-28 12:55:22

标签: regex tcl

我希望使用TCL中的正则表达式来捕获代码(从“ - ”到行尾)的所有内容。

所以我尝试了{\\-\\-.*$} -然后-然后任意数量的任何字符然后结束。但它不起作用!

此处的其他帖子建议使用.*?代替.*

所以我尝试了{\\-\\-.*?$},这很有效。

只是想了解两者之间的区别。根据任何正则表达式教程/ man我读到?条件应该是*的子集,所以我想知道那里发生了什么。

2 个答案:

答案 0 :(得分:1)

""使得前一个量词变得懒惰,使其匹配尽可能少的字符。

答案 1 :(得分:0)

这在re_syntax手册页中有记录。问号表示匹配应该是非贪婪的。

让我们看一个例子:

% set string "-1234--ab-c-"
-1234--ab-c-
% regexp -inline -- {--.*-} $string
--ab-c-
% regexp -inline -- {--.*?-} $string
--ab-

第一场比赛贪婪,与双击之后的最后短划线相匹配 第二场比赛并不贪心,只与双击之后的第一个短划线相匹配。

请注意,Tcl正则表达式引擎有一个怪癖:第一个量词的贪婪设置整个正则表达式的贪婪。这在MATCHING部分记录(IMO模糊):

  

...分支与其中具有偏好的第一个量化原子具有相同的偏好。

让我们尝试匹配所有数字,双击,查看非贪婪量词的工作原理:

% regexp -inline -- {\d+--.*-} $string
1234--ab-c-
% regexp -inline -- {\d+--.*?-} $string
1234--ab-c-
哎呀,即使我们要求一些非贪婪,整场比赛也很贪婪。 为了满足这个标准,要么我们需要使第一个量词非贪婪:

% regexp -inline -- {\d+?--.*?-} $string
1234--ab-

或使所有量词变得贪婪并使用否定括号表达式:

% regexp -inline -- {\d+--[^-]*-} $string
1234--ab-