【问题标题】:Matching a^n A^n with regular expression用正则表达式匹配 a^n A^n
【发布时间】:2010-06-27 14:08:42
【问题描述】:

我们正在学习正则语言和正则表达式的区别,老师解释说语言

a^n b^n

不是正则,但她说大多数正则表达式都可以匹配

a^n A^n

她为我们的额外学分作业问题提出了这个问题。我们已经苦苦挣扎了几天,真的可以使用一些指导。

【问题讨论】:

  • @kch 问题是你如何用正则表达式匹配该语言的字符串?

标签: regex


【解决方案1】:

老师通过将字母限制为{a, A} 给出了一个巨大的提示。解决这个问题的关键是意识到在不区分大小写模式下,a 匹配 A,反之亦然。问题的另一个组成部分是反向引用匹配。

此模式将匹配a{n}A{n} 某些n (as seen on rubular.com):

^(?=(a*)A*$)\1(?i)\1$

工作原理

该模式的工作原理如下:

  • ^(?=(a*)A*$) - 锚定在字符串的开头,我们使用正向前瞻来查看是否可以匹配 (a*)A* 直到字符串的结尾
    • 如果我们可以成功地做出这个断言,那么\1 捕获a{n} 的序列
    • 如果断言失败,那么字符串不可能是a{n}A{n},因为它甚至不是a*A*
  • 然后我们匹配\1(?i)\1$,即\1捕获的a{n},然后在不区分大小写的模式下(?i),我们再次匹配a{n}直到结束字符串
  • 因此,因为:
    • 字符串是a*A*
    • \1a{n}
    • \1(?i)\1 只能是a{n}A{n}

相关问题

参考文献

另见

【讨论】:

  • 对于刚刚学习语言理论的人来说,这个小简介值得在回答后阅读:en.wikipedia.org/wiki/…
  • +1,不错的解决方案。但是让我感到困惑的一件事是,您是如何推断出 'a^n' 的意思是 'a' 重复了 n 次?我没有从问题中明白这一点,但我想这是有道理的。
  • @Stephen:我相信这是语言理论中的常见符号。我链接到的问题使用相同的符号。我修改了我的答案以使用传统的正则表达式。
猜你喜欢
  • 2011-11-18
  • 2021-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多