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行为?
这是Tcl正则表达式实现的固有"特性".例如,下面是来自Henry Spencer(即使不是全部Tcl的正则表达式工作我也相信)
很难想出一个完全令人满意的混合贪婪正则表达式行为的定义.Perl没有尝试:Perl"规范"是对实现的描述,这是一种固有的低性能方法,涉及一次尝试一个匹配.由于许多原因,这是不能令人满意的,尤其是仅需要几页文本来描述它.(该实现及其描述是我之前的一个正则表达式包的远程,变异的后代,所以我分担了一些责任.)
当所有量词都是贪婪时,Tcl 8.2 regexp匹配最长的匹配(如POSIX标准的正则表达式定义中所指定的).当所有都非贪婪时,它匹配最短的匹配.这些令人满意的陈述都不适用于Perl.
麻烦的是,编写那些涵盖混合贪婪正则表达式的语句的泛化是非常非常困难的 - 一个适当的,独立于实现的定义,混合贪婪正则表达式应该匹配 - 并使它们做"什么"人们期待".我试过了.我还在努力.到目前为止没有运气.
Tcl 8.2正则表达式中的规则,基本上根据其子表达式给出了整个正则表达式的长/短优先选择,是迄今为止我提出的最好的规则.代码准确地实现了它们.我同意他们没有真正想要的东西.它看起来比它看起来更棘手.
基本上,混合贪婪和非贪婪量词的表达式会影响实现的简单性和性能.因此,实现使得第一个'类型'量词传递给所有其他量词.
换句话说,如果第一个量词是贪婪的,那么所有其他量词都会贪婪.如果第一个是非贪婪的,那么所有其他人都不会贪婪.因此,您不能强制Tcl正则表达式像Perl正则表达式那样工作(或者您可以通过exec并使用perl的bash命令版本,但我对此并不熟悉).
我会建议使用否定的类和/或锚点而不是非贪婪的.
由于我不知道你的问题的确切上下文,我不会提供另一种正则表达式,因为这将取决于这是否真的是你想要匹配的整个字符串.