【问题标题】:Why don't regular expression engines support all set operations?为什么正则表达式引擎不支持所有集合操作?
【发布时间】:2021-11-22 11:17:57
【问题描述】:

类似私人论坛上的这个问题:Why don’t RegEx implementations support intersection and complement?

从正则表达式构建的有限自动机在集合运算并集、交集、补集和差集下是封闭的。这些 FA 在两个附加操作 concatenation 和 Kleene star 下关闭。

有趣的是,连接、联合和星号操作在正则表达式实现中无处不在。为什么正则表达式引擎通常不支持其他集合操作的交集、补集和差集?

一个示例 FA,演示了来自 these lecture notes 的两个 FA substring 01odd number of 1s 的交集。

引用:

斯科特·阿伦森。 6.045J 自动机、可计算性和复杂性。 2011 年春季。麻省理工学院:MIT OpenCourseWare,https://ocw.mit.edu。许可:知识共享 BY-NC-SA。

【问题讨论】:

  • 非常感谢@Aaron。我还没有尝试实现环视,所以没有意识到算法是如何工作的。您知道差异操作的任何用例吗?
  • 很有道理,感谢您留下有用的 cmets @Aaron。如果您有空闲时间并想将您的 cmets 转换为答案,我很乐意接受。
  • 原来猜测是错误的,正则表达式确实起源于学术背景。从长远来看,这应该是给定时间段的默认猜测。

标签: regex state-machine regular-language finite-automata


【解决方案1】:

支持环视的正则表达式引擎让您可以实现交集、补集和差异:

  • (?=pattern1)pattern2 将匹配一个同时匹配 pattern1 和 pattern2 的字符串
  • (?!pattern).* 将匹配任何与模式不匹配的内容(尽管更现实的是,您会使用 pattern 作为正则表达式并让您的更高级别的环境反转匹配结果)
  • (?!pattern1)pattern2 将匹配被 pattern2 匹配但不被 pattern1 匹配的字符串

但是,环视是正则表达式历史上一个相当新的功能,并且仍然不受许多正则表达式引擎的支持。这是为什么呢?
我不太熟悉正则表达式的历史,但如果我相信粗略浏览一下维基百科的文章,它们源自数学家 Stephen Cole Kleene 的 definition of regular languages,它仅基于联合、连接和 Kleene 星运算,这可能解释了为什么那些是正则表达式中的基本操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多