匹配a ^ n A ^ n与正则表达式

use*_*886 4 regex

我们正在学习常规语言和正则表达式之间的区别,老师解释了这种语言

a^n b^n
Run Code Online (Sandbox Code Playgroud)

不常见,但她说大多数正则表达口味都可以匹配

a^n A^n
Run Code Online (Sandbox Code Playgroud)

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

pol*_*nts 11

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

这种模式将匹配a{n}A{n}一些n(如rubular.com上所示):

^(?=(a*)A*$)\1(?i)\1$
Run Code Online (Sandbox Code Playgroud)

这个怎么运作

该模式的工作原理如下:

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

相关问题

参考

也可以看看

  • 对于刚学习语言理论的人来说,在这个答案之后,这个小小的模糊值得阅读:http://en.wikipedia.org/wiki/Regular_expression#Patterns_for_non-regular_languages (2认同)