我想在 TCL 中使用正则表达式捕获代码注释(从“--”到行尾的所有内容)。
所以我尝试了
{\\-\\-.*$}
,应该是-
,然后是-
,然后是任意数量的任何字符,然后是行尾。但这不起作用!
这里的另一篇文章建议使用
.*?
而不是 .*
。
所以我尝试了
{\\-\\-.*?$}
并且有效。
只是想了解两者之间的区别。根据任何正则表达式教程/人,我读到
?
条件应该是 *
的子集,所以我想知道那里发生了什么。
是的,我的问题是关于“.?与.”,它与“.+?与.*?”不同。所以我不明白在哪个世界里这两个人可以成为“重复”??????
“?”使 de 前一个量词变得惰性,使其匹配尽可能少的字符。
这记录在 re_syntax 手册页中。问号表示匹配应该是非贪婪的。
让我们看一个例子:
% set string "-1234--ab-c-"
-1234--ab-c-
% regexp -inline -- {--.*-} $string
--ab-c-
% regexp -inline -- {--.*?-} $string
--ab-
第一个匹配是贪婪的,与双破折号后面的last破折号匹配。
第二个匹配不是贪婪的,仅匹配双破折号后面的first破折号。
请注意,Tcl 正则表达式引擎有一个怪癖:first量词的贪婪设置了整个正则表达式的贪婪。这在 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-