正则表达式中的贪婪运算符在Tcl 8.5中不起作用

use*_*991 2 regex perl tcl regex-greedy

看到这个简单的正则表达式代码:

puts [ regexp -inline {^\-\-\S+?=\S+} "--tox=9.0" ]
Run Code Online (Sandbox Code Playgroud)

输出是:

 >--tox=9
Run Code Online (Sandbox Code Playgroud)

似乎第二个\ S +非贪婪!只有1个字符匹配
在PERL中,可以看到结果如我所料,见1行输出:

perl -e '"--tox=9.0" =~/(^\-\-\S+?=\S+)/ ; print "${1}\n"'
--tox=9.0
Run Code Online (Sandbox Code Playgroud)

如何在Tcl中获取Perl行为?

Jer*_*rry 5

这是Tcl正则表达式实现的固有"特性".例如,下面是来自Henry Spencer(即使不是全部Tcl的正则表达式工作我也相信)

很难想出一个完全令人满意的混合贪婪正则表达式行为的定义.Perl没有尝试:Perl"规范"是对实现的描述,这是一种固有的低性能方法,涉及一次尝试一个匹配.由于许多原因,这是不能令人满意的,尤其是仅需要几页文本来描述它.(该实现及其描述是我之前的一个正则表达式包的远程,变异的后代,所以我分担了一些责任.)

当所有量词都是贪婪时,Tcl 8.2 regexp匹配最长的匹配(如POSIX标准的正则表达式定义中所指定的).当所有都非贪婪时,它匹配最短的匹配.这些令人满意的陈述都不适用于Perl.

麻烦的是,编写那些涵盖混合贪婪正则表达式的语句的泛化是非常非常困难的 - 一个适当的,独立于实现的定义,混合贪婪正则表达式应该匹配 - 并使它们做"什么"人们期待".我试过了.我还在努力.到目前为止没有运气.

Tcl 8.2正则表达式中的规则,基本上根据其子表达式给出了整个正则表达式的长/短优先选择,是迄今为止我提出的最好的规则.代码准确地实现了它们.我同意他们没有真正想要的东西.它看起来比它看起来更棘手.

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

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

我会建议使用否定的类和/或锚点而不是非贪婪的.

由于我不知道你的问题的确切上下文,我不会提供另一种正则表达式,因为这将取决于这是否真的是你想要匹配的整个字符串.