在阅读polygenelubricants关于高级正则表达式技术的系列文章(特别是How does this Java regex detect palindromes?)之后,我决定尝试创建自己的PCRE正则表达式来解析回文,使用递归(在PHP中)
我想出的是:
^(([a-z])(?1)\2|[a-z]?)$
我对这个表达式的理解是它应该匹配零个或一个字符(每个小于2个字符的字符串隐含一个回文,以及在递归中考虑奇数长度的回文),或者两个相同的字符由模式的递归分隔。
不幸的是,它似乎没有那样工作,正如你在www.ideone.com/a9T3F看到的那样。相反,只有2 n - 1的字符串(即空字符串,a
,aaa
,aaaaaaa
, a < sup> 15 )重复的字符与正则表达式匹配。
奇怪的是,如果我修改我的模式以便递归是可选的(即。^(([a-z])(?1)?\2|[a-z]?)$
,请参阅www.ideone.com/D6lJR,它只匹配字符重复2 n 次的字符串(即空字符串,a
,aa
,aaaa
,aaaaaaaa
, a 16 )。
为什么我的正则表达式不像我期望的那样工作?
注意那些渴望建议不要使用正则表达式的人:
这个问题的关键是学习如何正确使用递归正则表达式。我知道这不是确定字符串是否是回文的有效方法,如果由于某种原因必须确定生产代码中的回文,我不会使用递归正则表达式;我只是想了解有关正则表达式高级方面的更多信息。
答案 0 :(得分:8)
答案 1 :(得分:1)
如果您想要一个功能齐全的PCRE表达式来匹配回文,您可以使用以下内容:
/ ^。?(?:??()(= *(\ 1((2)\ 2))$))* + \ 2 $ /