why sed doesn't have non greedy regex
我不是在问sed中是否有贪婪的正则表达式,我已经知道没有。我要问的是:众所周知sed是现有的最好的或最好的流编辑器之一。那么,为什么该工具的开发人员没有实现非贪婪的正则表达式。与该工具可以做的所有事情相比,它看起来很简单。
- 仅供参考,"为什么事情会这样?"这类问题通常在这里做得不好,因为答案大多是主观的。
-
我只是以为某些开发人员,或者某些听到过开发人员类似回答的人可以告诉我为什么
-
非贪婪正则表达式首先通过PCRE成为主流。 sed的规范比PCRE早了几十年。
-
@ 0x5453:这个问题的答案根本不是主观的。我看不出拒绝这个问题或关闭它的理由。
-
@CasimiretHippolyte,尽管已经回答了,但我个人不确定这是一个好问题。为了获得超出标准文档范围的单个实现的答案,我们需要调查主要sed实现背后的人员的推理(并评估可能已经提交但未提交补丁的潜在贡献者的意图)。我相信人们已经达成共识,即"只有实现者才能回答"与该格式非常相符的问题,尽管Id需要在meta上进行更多的查找才能找到相同的引用。
-
@CharlesDuffy:我想您应该在回答中快速解释一下,有几种类型的正则表达式引擎可以用于不同的用途,并且非贪婪的量词是回溯引擎的特殊之处。这就是为什么我不认为答案是主观的,其原因在于技术的选择:一个拥有功能,另一个没有功能,实施者的理由非常重要。
-
...但是实现者的原因正是OP明确要求的!
-
@CharlesDuffy:因为他不知道"非贪婪"不是一个可以添加到您想要的任何东西的简单功能,所以有潜在的技术原因。这是他以自己的实际知识提出问题的唯一途径。
-
可能重复的stackoverflow.com/questions/11856054/
历史
非贪婪匹配是Perl兼容正则表达式的功能。 PCRE仅在Perl语言的一部分中可用,直到1997年实现libpcre,而sed的POSIX实现才在1992年首次引入-它引用的标准C库正则表达式例程的实现早于此。 ,已于1988年出版。
标准机构定义
sed的POSIX规范支持BRE;在POSIX中只指定了BRE("基本正则表达式")和ERE("扩展正则表达式"),并且两种形式都不包含非贪婪匹配。
因此,对于要标准化为包含在所有sed实现中的PCRE支持(或非贪婪匹配支持),首先需要在POSIX正则表达式定义中进行标准化。
但是,鉴于实际的原因,PCRE的支持可能是不可取的,因此在实践中极不可能发生这种情况(除非作为扩展名出现,或者由实施者选择)。请参阅以下部分:
实施注意事项
-
sed通常被视为"核心工具",因此仅以最小的依赖关系实现。因此,需要libpcre才能安装sed,这使得libpcre成为操作系统的一部分,即使大小很大的映像(initrd / initramfs映像等)中也需要包含libpcre。
-
有多种实现正则表达式的策略。历史(非常高性能)的实现将表达式编译为不确定的有限自动机,可以在O(n)时间内针对给定固定正则表达式的大小为n的字符串执行该自动机。 libpcre实现使用回溯-允许更轻松地实现诸如非贪婪匹配,超前和向后看等功能-但通常会具有比线性差的性能。
请参阅https://swtch.com/~rsc/regexp/regexp1.html,以了解汤普森NFA相对于回溯实现的性能优势。
- 所以,这是速度问题?一些贪婪的正则表达式很慢?
-
实现非贪婪正则表达式的最简单方法是使用回溯算法,在某些情况下,回溯比传统实现(即Thompson NFA)要慢得多,要慢得多。但是,可以构建允许回溯的NFA实现。链接的文章对此进行了详细介绍。