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 - 正则表达式(联合案例)的主要内容,如果未能解决你的问题,请参考以下文章