使用正则表达式匹配a^n A^n

4
我们正在学习常规语言和正则表达式之间的区别,老师解释说,常规语言是由有限的字符集组成的字符串集合,而正则表达式是一种用于匹配和操作文本的工具,它可以匹配各种复杂的模式。
a^n b^n

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

a^n A^n

她给我们布置了这个额外学分作业问题。我们已经苦苦挣扎了几天,非常需要一些指导。


2
@kch 问题是如何使用正则表达式匹配该语言的字符串? - cletus
1个回答

11

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

此模式将匹配a{n}A{n}如在rubular.com上所示),其中n为某个数字:

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

工作原理

该模式的工作方式如下:

  • ^(?=(a*)A*$) - 锚定在字符串开头,使用正向先行断言看是否可以匹配(a*)A*直到字符串结尾。
    • 如果我们成功地进行了这种断言,则\1捕获a{n}序列。
    • 如果断言失败,则字符串无法是a{n}A{n},因为它甚至不是a*A*
  • 然后我们匹配\1(?i)\1$,也就是\1捕获的a{n},然后再次匹配a{n}直到字符串结尾,在不区分大小写的模式 (?i)中。
  • 因此,由于:
    • 该字符串是a*A*
    • \1a{n}
    • \1(?i)\1只能是a{n}A{n}

相关问题

参考文献

另请参阅


2
对于刚开始学习语言理论的人来说,阅读这篇小文章是值得的:http://en.wikipedia.org/wiki/Regular_expression#Patterns_for_non-regular_languages - Donnie
+1,不错的解决方案。但有一件事让我困惑,你是怎么推断出 'a^n' 表示 'a' 重复 n 次的呢?我没有从问题中得到这个信息,但我猜这是有道理的。 - Stephen
1
@Stephen:我相信这是语言理论中常见的符号表示法。我链接的问题使用了相同的符号表示法。我已经修改了我的答案,使用传统的正则表达式符号表示法。 - polygenelubricants

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接