为什么正则表达式引擎不支持所有集合操作?
Why don't regular expression engines support all set operations?
类似于私人论坛上的这个问题:Why don’t RegEx implementations support intersection and complement?
由正则表达式构建的有限自动机在集合运算并集、交集、补集和差集下是封闭的。这些 FA 在两个额外的操作连接和 Kleene 星下关闭。
有趣的是,串联、并集和星号运算在正则表达式实现中无处不在。为什么正则表达式引擎通常不支持其他集合运算交集、补集和差集?
示例 FA 展示了 these lecture notes.
中两个 FA substring 01
和 odd number of 1s
的交集
引用:
Scott Aaronson. 6.045J Automata, Computability, and Complexity. Spring 2011. Massachusetts Institute of Technology: MIT OpenCourseWare, https://ocw.mit.edu. License: Creative Commons BY-NC-SA.
支持环视的正则表达式引擎让您可以实现交集、补集和差集:
(?=pattern1)pattern2
将匹配 pattern1 和 pattern2 都匹配的字符串
(?!pattern).*
将匹配任何与模式不匹配的内容(尽管更实际的做法是将 pattern
用作正则表达式并让更高级别的环境反转匹配结果)
(?!pattern1)pattern2
将匹配 pattern2 匹配但不匹配 pattern1 的字符串
然而,lookarounds 是正则表达式历史上一个相当新的功能,许多正则表达式引擎仍然不支持它。这是为什么?
我不太了解正则表达式的历史,但如果我相信粗略浏览维基百科文章,它们源自数学家 Stephen Cole Kleene 的 definition of regular languages,它仅基于联合、连接和 Kleene 星操作,这可能解释为什么这些是正则表达式中的基本操作。
类似于私人论坛上的这个问题:Why don’t RegEx implementations support intersection and complement?
由正则表达式构建的有限自动机在集合运算并集、交集、补集和差集下是封闭的。这些 FA 在两个额外的操作连接和 Kleene 星下关闭。
有趣的是,串联、并集和星号运算在正则表达式实现中无处不在。为什么正则表达式引擎通常不支持其他集合运算交集、补集和差集?
示例 FA 展示了 these lecture notes.
中两个 FAsubstring 01
和 odd number of 1s
的交集
Scott Aaronson. 6.045J Automata, Computability, and Complexity. Spring 2011. Massachusetts Institute of Technology: MIT OpenCourseWare, https://ocw.mit.edu. License: Creative Commons BY-NC-SA.
支持环视的正则表达式引擎让您可以实现交集、补集和差集:
(?=pattern1)pattern2
将匹配 pattern1 和 pattern2 都匹配的字符串(?!pattern).*
将匹配任何与模式不匹配的内容(尽管更实际的做法是将pattern
用作正则表达式并让更高级别的环境反转匹配结果)(?!pattern1)pattern2
将匹配 pattern2 匹配但不匹配 pattern1 的字符串
然而,lookarounds 是正则表达式历史上一个相当新的功能,许多正则表达式引擎仍然不支持它。这是为什么?
我不太了解正则表达式的历史,但如果我相信粗略浏览维基百科文章,它们源自数学家 Stephen Cole Kleene 的 definition of regular languages,它仅基于联合、连接和 Kleene 星操作,这可能解释为什么这些是正则表达式中的基本操作。