【问题标题】:Regular expression for odd number of a's奇数个a的正则表达式
【发布时间】:2017-09-01 11:32:36
【问题描述】:

我在解决以下练习时遇到问题,希望能提供任何帮助。

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

感谢您的宝贵时间

【问题讨论】:

  • 当然。例如,所有 abba 重复一次或多次的字符串由以下描述:Σ*(abba)+Σ*
  • 请注意,这应该在 CS Stack Exchange 上,这不是编程问题。
  • 我的错 - 我现在知道得更清楚了

标签: regex


【解决方案1】:
b*(ab*ab*)*ab*

它的主要部分是(ab*ab*)*,它列举了偶数个as的所有可能性。然后最后,必须存在一个额外的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

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

如果我们想让它在现实生活中使用更严格,最好在表达式中使用锚点来强制进行完整的字符串匹配:

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

因此:

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

【讨论】:

  • @MahanteshMAmbi 你错过了括号内bs 之后的星星我的朋友。
  • @MahanteshMAmbi $ echo aaabaaa | grep -P 'b*(ab*ab*)*ab*' --> aaabaaa
  • @MahanteshMAmbi 帮助您进一步理解为什么这是完整的正则表达式。在抽引引理中,正则表达式被定义为以pr*q的形式生成,表达式r只有一颗星。因此我肯定知道它涵盖了所有情况。有关更多详细信息,您可以阅读我粘贴在那里的抽引引理页面。
  • @HuStmpHrrr :我认为问题是关于具有奇数 a 的单词。所以 aaabaaa 不是一个有效的词。您的正则表达式不能允许偶数个 a。
  • @MahanteshMAmbi 我更新了答案。那应该回答你的问题。原来的答案是正确的。
【解决方案2】:
^[^a]*a(?=[^a]*(?:a[^a]*a)*[^a]*$).*$

这将为任何通用字符串找到奇数个a's。参见演示。

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

【讨论】:

  • 谢谢,但我正在寻找的答案与 HuStmpHrr 提供的答案完全相同
猜你喜欢
  • 2019-03-11
  • 2014-04-23
  • 2011-04-11
  • 1970-01-01
  • 2012-08-21
  • 2015-07-06
  • 2013-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多