我希望使用TCL中的正则表达式来捕获代码(从“ - ”到行尾)的所有内容。
所以我尝试了{\\-\\-.*$}
-
然后-
然后任意数量的任何字符然后结束。但它不起作用!
此处的其他帖子建议使用.*?
代替.*
。
所以我尝试了{\\-\\-.*?$}
,这很有效。
只是想了解两者之间的区别。根据任何正则表达式教程/ man我读到?
条件应该是*
的子集,所以我想知道那里发生了什么。
答案 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-