奇数a的正则表达式

ksk*_*cou 6 regex

我在解决以下练习时遇到问题,我会感激任何帮助.

设Σ= {a,b}.我需要为包含奇数a的所有字符串提供正则表达式.

感谢您的时间

Jas*_* Hu 9

b*(ab*ab*)*ab*
Run Code Online (Sandbox Code Playgroud)

它的主要部分是(ab*ab*)*,列举偶数个as的所有可能性.最后,还有一个额外的东西a让它变得奇怪.

注意这个正则表达式相当于:

b*a(b*ab*a)*b*
Run Code Online (Sandbox Code Playgroud)

这两个结构是由抽取引理定义的形式:

http://en.wikipedia.org/wiki/Pumping_lemma


更新:

@MahanteshMAmbi表达了他对正则表达式匹配案例的关注aaabaaa.事实上,它没有.如果我们跑grep,我们将清楚地看到匹配的东西.

$ echo aaabaaa | grep -P -o 'b*(ab*ab*)*ab*'
aaabaa
a
Run Code Online (Sandbox Code Playgroud)

-o选项grep将每行打印每个匹配的实例.在这种情况下,正如我们所看到的,正则表达式被匹配两次.一场比赛5 a秒,一场比赛1场比赛a.下面我的评论中的看似错误是由不正确的测试用例引起的,而不是正则表达式中的错误引起的.

如果我们想要在现实生活中使用它,那么在表达式中使用锚点来强制完整的字符串匹配可能更好:

^b*(ab*ab*)*ab*$
Run Code Online (Sandbox Code Playgroud)

因此:

$ echo aaabaaa | grep -P -q '^b*(ab*ab*)*ab*$'
$ echo $?
1
Run Code Online (Sandbox Code Playgroud)