语言如下。
∑={a,b,c}
L=ω的第二个和倒数第三个字符相同,ω的长度大于5,并且ω包含ccc。
我试着做了,但我不确定这是否正确。得到以下内容:
这是正确的吗?
不,这是不对的。例如,表达式无法识别字符串aaccc
,因为所有子表达式都要求字符串以ccc
开头,这与语言描述所指示的不同。
您的某些表达是正确的,例如需要拆分aa
、bb
和cc
部分。你有点过度使用括号,但这只是品味问题,而不是正确性问题。
你的基本单位是(aUbUc)
,代表∑
。字符串的某个位置必须包含ccc
,所以让我们从以下内容开始:
(aUbUc)*ccc(aUbUc)*
这是所有包含ccc
的字符串。下一个要求很复杂:倒数第三个字符和倒数第二个字符必须相同。这可能与ccc
部分重叠。如果没有,这就足够了:
(aUbUc)*ccc(aUbUc)*(aaUbbUcc)(aUbUc)
但这不允许我们有像accca
或aaccc
这样的字符串。然而,请注意,它确实要求所有字符串的长度至少为6,因此它满足字符串长度大于5的要求。我将缩写并使用∑
而不是(aUbUc)
来缩小它:
(∑*ccc∑*(aaUbbUcc)∑)U(∑∑∑∑*ccc)U(∑∑∑*ccc∑)
请注意额外的∑
s,这是填充其他子表达式所必需的,以确保所有路径的字符串长度都大于5。
直接生成正则表达式的另一种方法是构建与该语言匹配的DFA,然后将其转换为正则表达式。在构建DFA时,您会发现类似的问题,例如需要确保覆盖重叠情况,其中ccc
接近字符串的末尾。为了更容易,你可以从一个NFA开始,然后将你的NFA转换为DFA。