gpt4 book ai didi

php - 正则表达式引擎如何使用递归子模式解析正则表达式?

转载 作者:可可西里 更新时间:2023-11-01 13:47:49 25 4
gpt4 key购买 nike

这个正则表达式匹配回文:^((.)(?1)\2|.?)$

无法理解它的工作原理。递归何时结束,正则表达式何时从递归子模式中断并转到 "|.?" 部分?

谢谢。

编辑:抱歉我没有解释\2(?1)

(?1) - 引用第一个子模式(对它自己)

\2 - 向后引用第二个子模式的匹配项,即 (.)

以上示例是用 PHP 编写的。匹配“abba”(没有中间回文字符)和“abcba” - 有一个中间的非反射字符

最佳答案

^((.)(?1)\2|.?)$

^$ 分别断言字符串的开头和结尾。我们再看看中间的内容,比较有意思:

((.)(?1)\2|.?)
1------------1 // Capturing group 1
2-2 // Capturing group 2

看第一部分(.)(?1)\2,我们可以看到它会尝试匹配任何字符,最后是相同的字符(返回引用\2,指(.)匹配的字符。在中间,它会递归匹配整个捕获组1。注意有一个隐式断言(由 (.) 匹配开头的一个字符和 \2 引起的) > 匹配末尾相同的字符)要求字符串至少为 2 个字符。第一部分的目的是递归地截断字符串的相同末端。

看第二部分.?,我们可以看到它会匹配一个或0个字符。只有当字符串最初的长度为 0 或 1,或者递归匹配的剩余部分为 0 或 1 个字符时,才会匹配。第二部分的目的是匹配字符串从两端截断后的空字符串或单个孤字符。

递归匹配的工作原理:

  • 整个字符串必须是回文才能通过,由^$ 断言。我们不能从任何随机位置开始匹配。
  • 如果字符串 <= 1 个字符,则通过。
  • 如果字符串> 2个字符,是否接受仅由第一部分决定。如果匹配,它将被切断。
  • 剩下的如果匹配,只能被两端砍掉,或者如果它的长度<= 1则通过。

关于php - 正则表达式引擎如何使用递归子模式解析正则表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11670111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com