“.*”和“.*”有什么区别? [重复]

问题描述 投票:0回答:2

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

所以我尝试了

{\\-\\-.*$}
,应该是
-
,然后是
-
,然后是任意数量的任何字符,然后是行尾。但这不起作用!

这里的另一篇文章建议使用

.*?
而不是
.*

所以我尝试了

{\\-\\-.*?$}
并且有效。

只是想了解两者之间的区别。根据任何正则表达式教程/人,我读到

?
条件应该是
*
的子集,所以我想知道那里发生了什么。

是的,我的问题是关于“.?与.”,它与“.+?与.*?”不同。所以我不明白在哪个世界里这两个人可以成为“重复”??????

regex tcl
2个回答
1
投票

“?”使 de 前一个量词变得惰性,使其匹配尽可能少的字符。


0
投票

这记录在 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-
© www.soinside.com 2019 - 2024. All rights reserved.