参见以下简单的正则表达式代码:

puts [ regexp -inline {^\-\-\S+?=\S+} "--tox=9.0" ]

输出为:
 >--tox=9

似乎第二个\ S +是非贪婪的!仅匹配1个字符
在PERL中,可以看到结果与我预期的一样,请参阅1行输出:
perl -e '"--tox=9.0" =~/(^\-\-\S+?=\S+)/ ; print "${1}\n"'
--tox=9.0

如何获得Tcl中的Perl行为?

最佳答案

这是Tcl的regexp实现的固有“功能”。例如,below来自Henry Spencer(我相信,即使不是Tcl的全部正则表达式工作最多的人,他也做得最多)

很难得出一个完全令人满意的结果
混合贪婪正则表达式的行为定义。
Perl不会尝试:Perl的“规范”是对
实施,一种固有的低性能方法,涉及
一次尝试一场比赛。对于许多情况,这是不令人满意的
原因,不仅是因为要花几页文字才能
形容它。 (该实现及其描述距离遥远,
我较早的regexp软件包之一的突变后代,所以我分享
对此负责。)

当所有量词都为贪婪时,Tcl 8.2正则表达式与
尽可能长的匹配项(如POSIX标准的
正则表达式定义)。当所有内容都不是贪婪时,它会匹配
最短的比赛。这些理想的陈述都不是
对Perl如此。

麻烦在于,很难写一个概括
那些涵盖混合贪婪正则表达式的语句-
正确的,与实现无关的定义
混合贪婪的正则表达式应该匹配并使其匹配
做“人们期望什么”。我试过了。我还在努力没运气
远。

Tcl 8.2正则表达式中的规则,基本上给出了整个正则表达式
基于子表达式的长/短首选项是我最好的
到目前为止。该代码可以准确地实现它们。我同意
他们没有真正想要的。比这更棘手
看起来。

基本上,混合使用贪婪和非贪婪量词的表达式会影响实现的简单性和性能。因此,该实现使得将第一个“类型”的量词传递给所有其他量词。

换句话说,如果第一个量词是贪婪的,那么其他所有量词都是贪婪的。如果第一个是非贪婪的,那么其他所有的都是非贪婪的。因此,您不能强制Tcl regexp像Perl regexp一样工作(或者也许可以通过exec并使用perl的bash命令版本,但是我对此并不熟悉)。

我建议使用否定的类和/或锚,而不是非贪婪的。

由于我不知道您所问问题的确切上下文,因此我将不提供其他正则表达式,因为这将取决于这是否真的是您要匹配的整个字符串。

关于regex - 正则表达式中的贪婪运算符在Tcl 8.5中不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29228393/

10-13 02:44