Automata - 正则表达式(联合案例)

Posted

技术标签:

【中文标题】Automata - 正则表达式(联合案例)【英文标题】:Automata - Regular Expression (Union Case) 【发布时间】:2021-12-17 04:37:54 【问题描述】:

Automata 1) 识别至少有 2 个 a 的字符串

正则表达式 = b*ab*a(a+b)*

Automata 2) 识别至少有 2 个 b 的字符串

正则表达式 = a*ba*b(a+b)*

从A3 = A1 U A2得到的正则表达式等价于R3 = R1 + R2?还是不是?

R3 = b*ab*a(a+b)* + a*ba*b(a+b)*

【问题讨论】:

你可能忘记提问了…… 如果我做联合自动机(a3),我会得到相同的r1 + r2的正则表达式,还是会丢失一些情况? 自动机联合的定义是什么? 加号 (+) 不是正则表达式中的运算符。如果要捕获表达式 1 或表达式 2,请使用竖线 (|)。还要去掉空格,正则表达式会要求它们存在。 @ChrisMaurer 我确信 OP 使用的语法与他们正在研究的材料中定义的完全一样。在正则表达式中使用 + 作为 or 运算符在形式语言理论的上下文中并不少见(因为不关心空格)。 【参考方案1】:

正则表达式不像有限状态解析器,尝试将它们合并到复杂的解析场景中通常是错误的。

而且,它们也是解决特定问题的绝佳工具。在阅读了您的描述性要求后,有一个简单的正则表达式可以完成它,但以您可能没想到的方式。您的要求:

    至少有 2 个 a 的字符串

    至少有 2 个 b 的字符串

    两者的并集,或至少有两个 a 或两个 b 的字符串

    ([ab]).*?\1

此表达式打开一个捕获组以捕获 a 或 b。然后它允许零个或多个“任意字符”后跟捕获组中捕获的任何字符 (\1)。

【讨论】:

很明显,op 问题不是关于在任何特定编程语言中创建这样的正则表达式,而是关于理论计算机科学中的“常规语言”和“有限自动机”。理论计算机科学中没有“捕获组”之类的东西

以上是关于Automata - 正则表达式(联合案例)的主要内容,如果未能解决你的问题,请参考以下文章

Go语言的正则表式之regexp包

完整复习(包含语法)--MYSQL正则表达式

吃通javascript正则表达式

正则表达式

架构思维案例:速学正则

正则表达式初识及简单的案例应用