奇数a的正则表达式

时间:2015-03-06 15:53:38

标签: regex

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

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

感谢您的时间

2 个答案:

答案 0 :(得分:8)

b*(ab*ab*)*ab*

它的主要部分是(ab*ab*)*,它列举偶数a个的所有可能性。最后,必须有一个额外的a才能使它变得奇怪。

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

b*a(b*ab*a)*b*

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

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


更新:

@MahanteshMAmbi表达了对匹配案例aaabaaa的正则表达式的关注。事实上,它并没有。如果我们运行grep,我们会清楚地看到匹配的内容。

$ echo aaabaaa | grep -P -o 'b*(ab*ab*)*ab*'
aaabaa
a
-o

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

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

^b*(ab*ab*)*ab*$

因此:

$ echo aaabaaa | grep -P -q '^b*(ab*ab*)*ab*$'
$ echo $?
1

答案 1 :(得分:1)

^[^a]*a(?=[^a]*(?:a[^a]*a)*[^a]*$).*$

对于任何通用字符串,这将只找到奇数a's。参见演示。

https://regex101.com/r/eS7gD7/22