为什么sed没有非贪婪的正则表达式

why sed doesn't have non greedy regex

我不是在问sed中是否有贪婪的正则表达式,我已经知道没有。我要问的是:众所周知sed是现有的最好的或最好的流编辑器之一。那么,为什么该工具的开发人员没有实现非贪婪的正则表达式。与该工具可以做的所有事情相比,它看起来很简单。


历史

非贪婪匹配是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相对于回溯实现的性能优势。