你是否已经在正则表达式中使用了Perl 5.10回溯控制动词?

12

你是否已经在正则表达式中使用了 Perl 5.10 回溯控制动词?这些动词解决了哪些问题呢?


作为背景,我尝试了一些调整,但没有得到任何真正有用的结果。

相比之下,当我开始理解 (?> 分组的作用后,它在我的正则表达式中开始经常出现。我喜欢将 Perl 正则表达式的世界调整为特定的假设集。随着正则表达式语言的功能越来越多,回溯使得正则表达式的性能与它们基于的 FSA(有限状态自动机)大相径庭。


当有人能告诉我有哪些其他实现的正则表达式拥有回溯控制动词——而 PCRE 没有——我可以承认这属于精通正则表达式的人的普遍专业领域。这是一个关于 Perl 正则表达式的问题,帮助 Ruby、Python、C#、JavaScript 或任何 PCRE 客户端实现的人可能无法提供帮助,或者认为这是他们通常不会阅读的标签的浪费。


我们需要为 [perl-regex] 创建一个标签吗? - Brad Gilbert
1
在 regex 标签下有太多特定于实现的帖子。有些人说“只有 Java”或“在 C# 中……”。这让我很烦,因为据我所知,只有 Perl 有这些动词,因此它是特定于 Perl 的。 - Axeman
我不认为“问题的答案往往几乎完全基于观点”是一个可信的批评。一个呈现的应用程序要么使用正则表达式动词,要么不使用,要么有效,要么无效,类似于对其他问题提出的“解决方案”。而它是否解决了足够重要的问题,也取决于投票系统本身所包含的主观性类型,即决定一个“解决方案”如何适合问题的程度。 - Axeman
继续:事实:正则表达式动词可以解决哪些问题?参考:是的,我已经用这种方式解决了它们(其中包括一个带有控制动词的正则表达式)具体专业知识:自从发布这个问题以来的6年里,某人应该已经利用他们对正则表达式动词的知识形成了不止“一个有趣的解决方案”和“一个实用的解决方案”。 - Axeman
3个回答

3
是的,我有过这样的经历,虽然不是太多。通常我会使用它们来控制回溯,以强制进行更多的排列组合。这里有一个有趣的解决方案和一个实用的解决方案。请参考此处此处

1
终于,我学会了如何使用一些正则表达式动词。感谢您,也感谢(perlre)[http://perldoc.perl.org/perlre.html] 中似乎有扩展部分的帮助(但这或许也是您的功劳),我实际上提出了第二种解决方案的这个替代 RE:qr{ x (*PRUNE) (a?b?c?) (?(?{$1})|(*FAIL)) }x - Axeman

2
自我 Perl 编程已经数年了,直到你提到这个功能,我才知道它的存在。看起来像是只有正则表达式大师才会使用的高级功能(当然���Perl 社区有很多这样的人)。另一方面,Perl 6 的语法看起来将非常有趣。
目前,我对原子组和占有量词感到满意——实际上,我几乎已成了瘾君子。已经到了我本能地尝试以这种方式编写正则表达式,使它们永远不会回溯的地步。有时候我必须提醒自己,回溯在小剂量下是可以接受的,而且消除它完全不值得这么做。
P.S. 据我所知,占有量词只受 Java、PCRE(PHP、Apache、Flex 3/ActionScript 3)和 RegexBuddy、EditPad Pro 和 PowerGrep 使用的 JGSoft 正则表达式引擎支持。
更新:Oniguruma 风格(用于 Ruby 1.9+ 和 TextMate)支持原子组和占有量词。当然,Perl 5.10 也支持它们,除了回溯控制动词之外。

1
说实话,我还没有真正使用过5.10。尽管一些新功能非常棒,但我只在个人脚本中使用它们。对于生产环境,我会针对5.8进行兼容性开发。对于CPAN,我则会针对5.6进行开发。这使我无法玩转大部分新功能。
回溯控制功能很有趣,但我认为除了解析器之外,很难找到其他应用场景。我无法想象将整个解析器塞进一个正则表达式中。(即使现在支持递归!)我更加期待Perl6语法的到来。

我同意语法很重要,但动词现在有点让我们头疼。 - Axeman
1
他们确实提供了一些内容,但似乎更像是一个预告而不是立即有用的东西。在perlre中还有一个小小的“警告:这些模式是实验性的,可能会发生改变或删除...”提示。 - Michael Carman
目前我编程所使用的最低版本是5.10.0。在此之前,要做出合理的事情实在太难了。我需要它来获得更好的正则表达式支持和更好的Unicode支持。 - tchrist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接