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

时间:2016-10-18 20:36:12

标签: regex sed

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

1 个答案:

答案 0 :(得分:7)

历史

非贪婪匹配是Perl-Compatible Regular Expressions的一项功能。 PCRE仅在1997年libpcre实现之前作为Perl语言的一部分提供,而sed的POSIX实现在1992年首次引入 - 并且它引用的标准C库正则表达式例程的实现早于即便如此,已于1988年出版。

标准 - 身体定义

The POSIX specification for sed支持BRE;只有BRE(“基本正则表达式”)和ERE(“扩展正则表达式”)完全是specified in POSIX,并且两种形式都不包含非贪婪匹配。

因此,要将PCRE支持(或者,非贪婪匹配支持)标准化以包含在所有sed实现中,首先需要在POSIX正则表达式定义中进行标准化。

然而,考虑到PCRE支持可能不合适的实际原因,在实践中这种情况不太可能高度不太可能发生(除了作为扩展存在或不存在,在实现者的选择下) ;请参阅以下部分:

实施注意事项

  • sed通常被视为“核心工具”,因此仅使用最小的依赖项实现。因此,要求libpcre安装sed会使libpcre成为操作系统的一部分,即使在大小非常高的图像中也需要包含它(initrd / initramfs图像等)。
  • 可以使用多种策略来实现正则表达式。历史(非常高性能)实现将表达式编译成非确定性有限自动机,其可以在给定固定正则表达式的大小为n的字符串的O(n)时间内执行。 libpcre实现使用回溯 - 这允许更容易地实现诸如非贪婪匹配,前瞻和后瞻等功能 - 但通常具有远比线性更差的性能。)

有关Thompson NFA在回溯实现方面的性能优势的讨论,请参阅https://swtch.com/~rsc/regexp/regexp1.html