【问题标题】:How to check that a string is a palindrome using regular expressions?如何使用正则表达式检查字符串是否为回文?
【发布时间】:2010-09-18 23:52:27
【问题描述】:

这是一个我无法回答的面试问题:

如何使用正则表达式检查字符串是否为回文?

附言已经有一个问题“How to check if the given string is palindrome?”,它给出了很多不同语言的答案,但没有使用正则表达式的答案。

【问题讨论】:

标签: regex palindrome


【解决方案1】:

这个问题的答案是“不可能”。更具体地说,面试官想知道你是否在计算理论课上专心。

在您的计算理论课上,您学习了有限状态机。有限状态机由节点和边组成。每条边都用有限字母表中的一个字母进行注释。一个或多个节点是特殊的“接受”节点,一个节点是“开始”节点。当从给定单词中读取每个字母时,我们会遍历机器中的给定边。如果我们最终处于接受状态,那么我们就说机器“接受”了这个词。

正则表达式总是可以翻译成等效的有限状态机。也就是说,接受和拒绝与正则表达式相同的单词(在现实世界中,一些正则表达式语言允许任意函数,这些不算数)。

不可能建立一个接受所有回文的有限状态机。证明依赖于这样一个事实,即我们可以很容易地构建一个需要任意大量节点的字符串,即字符串

a^x b a^x(例如 aba、aabaa、aaabaaa、aaaabaaaa、...)

其中 a^x 是重复 x 次。这至少需要 x 个节点,因为在看到“b”之后,我们必须倒数 x 次以确保它是回文。

最后,回到最初的问题,您可以告诉面试官,您可以编写一个正则表达式来接受所有小于某个有限固定长度的回文。如果有一个现实世界的应用程序需要识别回文,那么它几乎肯定不会包括任意长的回文,因此这个答案将表明您可以将理论上的不可能与现实世界的应用区分开来。不过,实际的正则表达式会很长,比等效的 4 行程序长得多(对读者来说很容易练习:编写一个识别回文的程序)。

【讨论】:

  • @SteveMoser 在 Ruby 1.9.x 中,正则表达式不再是正则(在自动机理论意义上),因此检查回文之类的事情是可能的。但是,出于意图和目的,不能使用 Regular 正则表达式检查回文(有意义吗?)。
  • @SteveMoser 有一篇关于 Ruby 正则表达式引擎的好文章 (>=1.9) here
  • @John 对,所以在问题的上下文中 Jose 是对的,hqt 是错的。
  • 在学术术语中,正则表达式具有特定的边界(定义 DFA)。实际上,许多正则表达式引擎(主要是 Perl 及其亲属)支持违反学术定义(成为 NFA 甚至更广泛)的反向引用。所以这个问题有不同的答案,具体取决于提问者的参考框架。
  • 在口试中你应该使用“formalz it is not possible”,但你应该指出一些正则表达式引擎允许这样做。
【解决方案2】:

虽然PCRE 引擎确实支持递归正则表达式(请参阅the answer by Peter Krauss),但您不能在ICU 引擎(例如Apple 使用的)上使用正则表达式来实现此目的而无需额外的代码。您需要执行以下操作:

这会检测任何回文,但确实需要一个循环(这是必需的,因为正则表达式无法计数)。

$a = "teststring";
while(length $a > 1)
{
   $a =~ /(.)(.*)(.)/;
   die "Not a palindrome: $a" unless $1 eq $3;
   $a = $2;
}
print "Palindrome";

【讨论】:

  • 好答案。这个问题没有要求一个单一的正则表达式直接检测回文 - 它只是要求一种检测回文的方法,该方法使用正则表达式。恭喜您以这种方式看待它。
  • 另请参见仅使用一个正则表达式的最简单匹配(无字符串操作)stackoverflow.com/a/48608623/287948
  • 谢谢@PeterKrauss。不知道PCRE有递归。引用了您的答案。
【解决方案3】:

这是不可能的。回文不是由常规语言定义的。 (看,我确实学到了一些计算理论)

【讨论】:

  • 大多数正则表达式引擎捕获的不仅仅是正则语言(例如,net 可以捕获匹配的括号)。只有标准正则表达式仅限于常规语言。
  • 这个问题确实使用了“正则表达式”这个词......所以 ZCHudson 的回答是正确的。
  • @austirg:ZCHudson 的回答是正确但不完整。现代编程语言中使用的正则表达式和理论 CS 课程中使用的正则表达式是不同的野兽。这个词只是一个历史遗产。请参阅stackoverflow.com/questions/233243#235199 和我的回答。
  • @J.F. Sebastian - 我必须同意 austirg 的观点。当术语正则表达式在没有提及特定编程语言的情况下使用时,则适用 comp sci 定义。并非所有支持正则表达式的语言都可以做到这一点,所以我们不应该假设这里使用的语言可以做到这一点。
  • @Rontologist:我认为问题中编程语言的选择没有限制,因此允许使用任何语言。看右边:相关题中的“正则表达式”是什么意思?其中是否提到了特定的编程语言?
【解决方案4】:

使用 Perl 正则表达式:

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

但是,正如许多人指出的那样,如果您想严格,这不能被视为正则表达式。 正则表达式不支持递归。

【讨论】:

  • 这在 PCRE 中不起作用(它与 "ababa" 不匹配),但它在 Perl 5.10 中起作用
  • 你是对的。 PCRE 似乎确实将递归视为一个原子组,而 Perl 允许在其中进行回溯。我认为在 PCRE 中无法进行此检查。
  • 令人惊讶的是,它不适用于非拉丁语言,例如亚美尼亚语。
  • @Temujin 要么是因为 unicode 字符被匹配为编码字节(添加 /u modifier),要么是因为组合字符。 (将. 替换为\X escape sequence)。
  • 我的模式在 PCRE 中不起作用。它确实在 Perl 中工作。当子字符串重复时,您的模式会失败。例如abababa。使用基于 PCRE 的正则表达式引擎时,不可能使其与每个输入的递归一起工作。 Casimirs 正则表达式使用了一种不同的方法,使用迭代和可变状态,非常令人着迷。
【解决方案5】:

Here's 用于检测任何类型的字符的 4 字母回文(例如:契约):

\(.\)\(.\)\2\1

Here's 用于检测 5 个字母的回文(例如:雷达),仅检查字母:

\([a-z]\)\([a-z]\)[a-z]\2\1

看来我们需要为每个可能的字长使用不同的正则表达式。 Python 邮件列表中的This post 包含一些关于原因的详细信息(有限状态自动机和抽引引理)。

【讨论】:

  • 你能解释一下 5 字母回文的正则表达式吗?
【解决方案6】:

根据你的自信程度,我会给出这个答案:

我不会用普通的 表达。这不是一个合适的 使用正则表达式。

【讨论】:

  • 希望您能多解释一下,以表明您真正了解正则表达式的局限性。您的简单回答可能会被视为“我被难住了”。
  • 因此他给出了依赖子句。
【解决方案7】:

是的,您可以在 .Net 中完成!

(?<N>.)+.?(?<-N>\k<N>)+(?(N)(?!))

您可以查看here!这是一篇精彩的文章!

【讨论】:

  • .NET 风格的正则表达式的全部意义在于它们不是 regular 因为它们不是有限状态自动机;从理论上讲,它们并不是真正的正则表达式。
【解决方案8】:

StackOverflow 充满了诸如“正则表达式?不,他们不支持它。他们不能支持它。”之类的答案。

事实是,正则表达式与正则语法不再有任何关系。现代正则表达式具有递归和平衡组等功能,以及它们实现的可用性不断增长(例如,请参见此处的 Ruby 示例)。在我看来,坚持认为我们领域中的正则表达式不是编程概念的旧观念只会适得其反。与其因为选择不再合适的词而憎恨他们,不如让我们接受事物并继续前进。

这是quote from Larry Wall,Perl 本身的创建者:

(...) 通常与我们所说的“正则表达式”有关,它与真正的正则表达式只有很小的关系。尽管如此,这个术语随着我们模式匹配引擎的功能而增长,所以我不打算在这里与语言的必要性作斗争。但是,我通常会称它们为“正则表达式”(或“正则表达式”,当我处于盎格鲁-撒克逊语境时)。

这是blog postone of PHP's core developers

由于文章比较长,这里总结一下要点:

  • 程序员使用的“正则表达式”与形式语言理论中的原始正则性概念几乎没有共同之处。
  • 正则表达式(至少 PCRE)可以匹配所有上下文无关语言。因此,它们还可以匹配格式良好的 HTML 和几乎所有其他编程语言。
  • 正则表达式至少可以匹配一些上下文相关的语言。
  • 正则表达式的匹配是 NP 完全的。因此,您可以使用正则表达式解决任何其他 NP 问题。

话虽如此,您可以使用以下方法将回文与正则表达式匹配:

^(?'letter'[a-z])+[a-z]?(?:\k'letter'(?'-letter'))+(?(letter)(?!))$

...这显然与常规语法无关。
更多信息在这里:http://www.regular-expressions.info/balancing.html

【讨论】:

    【解决方案9】:

    正如一些人已经说过的,没有一个单一的正则表达式可以检测到开箱即用的一般回文,但是如果你想检测到一定长度的回文,你可以使用类似

    (.?)(.?)(.?)(.?)(.?).?\5\4\3\2\1
    

    【讨论】:

      【解决方案10】:

      你也可以不使用递归:

      \A(?:(.)(?=.*?((?(2)\1\2|\1))\z))*?.?\2\z
      

      允许单个字符:

      \A(?:(?:(.)(?=.*?((?(2)\1\2|\1))\z))*?.?\2|.)\z
      

      适用于 Perl、PCRE

      demo

      对于 Java:

      \A(?:(.)(?=.*?(\1\2\z|(?<!(?=\2\z).{0,1000})\1\z)))*?.?\2\z
      

      demo

      【讨论】:

      • 这是对正则表达式问题的一个非常有趣的答案。实际上唯一的模式是passed some of my tests。感谢这个卡西米尔:)
      • @bobblebubble:感谢您的支持。如您所见,我最近编辑了这个答案,因为以前的版本是错误的(三年了,真可惜)。
      【解决方案11】:

      现在可以在 Perl 中完成。使用递归引用:

      if($istr =~ /^((\w)(?1)\g{-1}|\w?)$/){
          print $istr," is palindrome\n";
      }
      

      根据接近最后的部分修改http://perldoc.perl.org/perlretut.html

      【讨论】:

        【解决方案12】:

        在 ruby​​ 中,您可以使用命名的捕获组。所以这样的事情会起作用 -

        def palindrome?(string)
          $1 if string =~ /\A(?<p>| \w | (?: (?<l>\w) \g<p> \k<l+0> ))\z/x
        end
        

        试一试,效果不错……

        1.9.2p290 :017 > palindrome?("racecar")
         => "racecar" 
        1.9.2p290 :018 > palindrome?("kayak")
         => "kayak" 
        1.9.2p290 :019 > palindrome?("woahitworks!")
         => nil 
        

        【讨论】:

        • 命名捕获组不是严格的正则表达式。 willamette.edu/~fruehr/LLC/lab5.html
        • 你是对的。这就是我特别指出您必须使用命名捕获组的原因。
        • 有人可以为新手逐字解释RE吗?我了解以下所有内容(逗号分隔“原子”)/,\A,(,|,\w,|,(,(,\w,),),),\z,/,x 但我不'不理解这些 ?

          ,?:,?,\g

          ,\k 我正在使用 rubular.com 寻求帮助,它似乎理解 RE (自然),但这并不能帮助我看到它,甚至“对于完整的 Ruby 正则表达式指南,请参阅 Pickaxe。”没有帮助,因为与“Pickaxe”链接的站点没有解释我无法理解的原子。我知道 ?遵循 a 匹配零个或一个 a,但是?在一个字符之前?

        • 啊,命名的捕获组!好的。 @SteveMoser 现在是一个断开的链接,但我找到了another。感谢 Taylor 提到它们,否则,我不知道 ?

          和 ? 和 ?: (non-capturing capture group) 和 \g

          和 \k。我还是看不到什么?

          |虽然是。不 | “或”是什么意思?我无法在 REs 中找到有关管道用法的文档。我仍然很高兴看到这个非常好的 RE 的详细解释。

        • @KevinFordTheSubmariner 我认为(?&lt;p&gt;|.. 语法只是意味着它允许不匹配任何内容.. 或其他替代方案。 (?&lt;p&gt;..) 语法只是一个命名的捕获组。可以使用\k&lt;p&gt; 引用它以进行精确匹配,而不是反向引用组号。 +0 表示同一级别的递归。
        【解决方案13】:

        递归正则表达式可以做到!

        如此简单且不言而喻的算法来检测包含回文的字符串:

           (\w)(?:(?R)|\w?)\1
        

        rexegg.com/regex-recursion,教程解释了它是如何工作的。


        它适用于任何语言,这里是一个使用 PHP 改编自与概念验证相同的源(链接)的示例:

        $subjects=['dont','o','oo','kook','book','paper','kayak','okonoko','aaaaa','bbbb'];
        $pattern='/(\w)(?:(?R)|\w?)\1/';
        foreach ($subjects as $sub) {
          echo $sub." ".str_repeat('-',15-strlen($sub))."-> ";
          if (preg_match($pattern,$sub,$m)) 
              echo $m[0].(($m[0]==$sub)? "! a palindrome!\n": "\n");
          else 
              echo "sorry, no match\n";
        }
        

        输出

        dont ------------> sorry, no match
        o ---------------> sorry, no match
        oo --------------> oo! a palindrome!
        kook ------------> kook! a palindrome!
        book ------------> oo
        paper -----------> pap
        kayak -----------> kayak! a palindrome!
        okonoko ---------> okonoko! a palindrome!
        aaaaa -----------> aaaaa! a palindrome!
        bbbb ------------> bbb
        

        比较

        正则表达式^((\w)(?:(?1)|\w?)\2)$ 做同样的工作,但作为yes/not 代替“包含”。
        PS:它使用的定义是“o”不是回文,“able-elba”连字符格式不是回文,但“ableelba”是。将其命名为 definition1
        当“o”和“able-elba”是回文时,命名为definition2

        与另一个“回文正则表达式”比较,

        • ^((.)(?:(?1)|.?)\2)$ 上面没有\w 限制的base-regex,接受“able-elba”。

        • ^((.)(?1)?\2|.)$ (@LilDevil) 使用 definition2(接受“o”和“able-elba”,因此在识别“aaaaa”和“bbbb”字符串时也存在差异) .

        • ^((.)(?1)\2|.?)$ (@Markus) 未检测到“kook”和“bbbb”

        • ^((.)(?1)*\2|.?)$ (@Csaba) 使用definition2


        注意:要进行比较,您可以在 $subjects 添加更多单词,并为每个比较的正则表达式添加一行,

          if (preg_match('/^((.)(?:(?1)|.?)\2)$/',$sub)) echo " ...reg_base($sub)!\n";
          if (preg_match('/^((.)(?1)?\2|.)$/',$sub)) echo " ...reg2($sub)!\n";
          if (preg_match('/^((.)(?1)\2|.?)$/',$sub)) echo " ...reg3($sub)!\n";
          if (preg_match('/^((.)(?1)*\2|.?)$/',$sub)) echo " ...reg4($sub)!\n";
        

        【讨论】:

        【解决方案14】:

        实际上使用字符串操作比使用正则表达式更容易:

        bool isPalindrome(String s1)
        
        {
        
            String s2 = s1.reverse;
        
            return s2 == s1;
        }
        

        我知道这并不能真正回答面试问题,但你可以用它来展示你如何知道更好的完成任务的方法,而且你不是典型的“拿着锤子的人,看到所有问题作为钉子。”

        【讨论】:

        • 虽然我非常喜欢这个答案,但我确实认为使用 BreakIterator 将字符串正确拆分为可视字符会得到加分。
        【解决方案15】:

        这是我对Regex Golf's 5th level(一个男人,一个计划)的回答。它适用于浏览器的 Regexp 最多 7 个字符(我使用的是 Chrome 36.0.1985.143)。

        ^(.)(.)(?:(.).?\3?)?\2\1$
        

        这是一个最多 9 个字符

        ^(.)(.)(?:(.)(?:(.).?\4?)?\3?)?\2\1$
        

        为了增加它可以处理的最大字符数,您会反复将 .? 替换为 (?:(.).?\n?)?.

        【讨论】:

        • 我用稍微少一点的字符来管理那个,^(.)(.)(.)?.?\3\2\1$
        • 非常感谢您对我的宠爱 :-)
        • 为什么其他人有 13 个,但这是 19 个
        【解决方案16】:

        关于 PCRE 表达式(来自 MizardX):

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

        你测试了吗?在我的 Win XP Pro 下的 PHP 5.3 上它失败了:aaaba 实际上,我稍微修改了表达式,改为:

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

        我认为正在发生的事情是,虽然外面的一对字符被锚定了,但其余的内部字符却没有。这不是完整的答案,因为虽然它错误地传递了“aaaba”和“aabaacaa”,但它确实在“aabaaca”上失败了。

        我想知道是否有解决此问题的方法,还有, Perl 示例(由 JF Sebastian / Zsolt 编写)是否正确通过了我的测试?

        来自维也纳的 Csaba Gabor

        【讨论】:

          【解决方案17】:
          /\A(?<a>|.|(?:(?<b>.)\g<a>\k<b+0>))\z/
          

          对 Oniguruma 引擎有效(在 Ruby 中使用)

          取自Pragmatic Bookshelf

          【讨论】:

            【解决方案18】:

            在 Perl 中(另见 Zsolt Botykai's answer):

            $re = qr/
              .                 # single letter is a palindrome
              |
              (.)               # first letter
              (??{ $re })??     # apply recursivly (not interpolated yet)
              \1                # last letter
            /x;
            
            while(<>) {
                chomp;
                say if /^$re$/; # print palindromes
            }
            

            【讨论】:

              【解决方案19】:

              正如ZCHudson 所指出的,确定某事是否为回文无法使用通常的正则表达式来完成,因为回文集不是常规语言。

              我完全不同意Airsource Ltd,他说“不可能”不是面试官想要的答案。在我的面试中,当我面对一个好的候选人时,我会提出这样的问题,以检查当我们向他提出做错事时,他是否能找到正确的论点。我不想雇用一个如果他知道更好的人就会试图以错误的方式做某事的人。

              【讨论】:

                【解决方案20】:

                你可以用 perl 做的事情:http://www.perlmonks.org/?node_id=577368

                【讨论】:

                • 请为任何链接添加上下文,以便您的答案是独立的,这意味着答案需要在答案本身中。见"Provide context for links"。如果您可以在此处用自己的话回答问题并仅作为参考链接,那将是更好的选择。
                【解决方案21】:

                我会向面试官解释,由回文组成的语言不是常规语言,而是与上下文无关的语言。

                匹配所有回文的正则表达式是infinite。相反,我建议他将自己限制在可以接受的最大回文数;或者如果需要所有回文,至少使用某种类型的 NDPA,或者只使用简单的字符串反转/等于技术。

                【讨论】:

                  【解决方案22】:

                  在您用完捕获组之前,您可以使用正则表达式做的最好的事情:

                  /(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?)(.?).?\9\8\7\6\5\4\3\2\1/
                  

                  这将匹配长度不超过 19 个字符的所有回文。

                  以编程方式解决所有长度问题都很简单:

                  str == str.reverse ? true : false
                  

                  【讨论】:

                  • 您的正则表达式不起作用。例如,它将表明“abac”是一个匹配...
                  【解决方案23】:

                  我还没有代表内联评论,但 MizardX 提供并由 Csaba 修改的正则表达式可以进一步修改以使其在 PCRE 中工作。我发现的唯一失败是单字符字符串,但我可以单独测试。

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

                  如果您可以使其在任何其他字符串上失败,请发表评论。

                  【讨论】:

                    【解决方案24】:
                    #!/usr/bin/perl
                    
                    use strict;
                    use warnings;
                    
                    print "Enter your string: ";
                    chop(my $a = scalar(<STDIN>));    
                    my $m = (length($a)+1)/2;
                    if( (length($a) % 2 != 0 ) or length($a) > 1 ) { 
                      my $r; 
                      foreach (0 ..($m - 2)){
                        $r .= "(.)";
                      }
                      $r .= ".?";
                      foreach ( my $i = ($m-1); $i > 0; $i-- ) { 
                        $r .= "\\$i";
                      } 
                      if ( $a =~ /(.)(.).\2\1/ ){
                        print "$a is a palindrome\n";
                      }
                      else {
                        print "$a not a palindrome\n";
                     }
                    exit(1);
                    }
                    print "$a not a palindrome\n";
                    

                    【讨论】:

                      【解决方案25】:

                      从自动机理论来看,它不可能匹配任何长度的回文(因为这需要无限量的内存)。但是有可能匹配固定长度的回文。 说可以编写一个匹配所有长度 =5 等上限不清楚的地方

                      【讨论】:

                        【解决方案26】:

                        在 Ruby 中,您可以使用 \b(?'word'(?'letter'[a-z])\g'word'\k'letter+0'|[a-z])\b 匹配回文词,例如 a, dad, radar, racecar, and redivider。 ps : 这个正则表达式只匹配长度为奇数个字母的回文词。

                        让我们看看这个正则表达式如何匹配雷达。单词边界 \b 在字符串的开头匹配。正则表达式引擎输入捕获组“word”。 [a-z] 匹配 r,然后将其存储在堆栈中,用于递归级别为零的捕获组“字母”。现在正则表达式引擎进入组“word”的第一个递归。 (?'letter'[a-z]) 在递归级别 1 匹配并捕获 a。正则表达式输入组“单词”的第二次递归。 (?'letter'[a-z]) 在递归级别 2 捕获 d。在接下来的两次递归中,该组在第三和第四级捕获 a 和 r。第五次递归失败,因为字符串中没有字符可供 [a-z] 匹配。正则表达式引擎必须回溯。

                        正则表达式引擎现在必须尝试组“word”中的第二种选择。正则表达式中的第二个 [a-z] 与字符串中的最后一个 r 匹配。引擎现在从成功的递归中退出,返回到第三次递归。

                        匹配 (&word) 后,引擎到达 \k'letter+0'。反向引用失败,因为正则表达式引擎已经到达主题字符串的末尾。于是又一次回溯。第二种选择现在与 a 匹配。正则表达式引擎退出第三次递归。

                        正则表达式引擎再次匹配 (&word),需要再次尝试反向引用。反向引用指定 +0 或当前的递归级别,即 2。在此级别,捕获组匹配 d。反向引用失败,因为字符串中的下一个字符是 r。再次回溯,第二个选择匹配d。

                        现在,\k'letter+0' 匹配字符串中的第二个 a。这是因为正则表达式引擎已经返回到捕获组匹配第一个 a 的第一个递归。正则表达式引擎退出第一个递归。

                        正则表达式引擎现在回到所有递归之外。即这个级别,捕获组存储了 r。反向引用现在可以匹配字符串中的最后一个 r。由于引擎不再在任何递归内部,因此它继续执行组之后的正则表达式的其余部分。 \b 匹配字符串的末尾。到达正则表达式的末尾,雷达作为整体匹配返回。

                        【讨论】:

                        【解决方案27】:

                        这里是 PL/SQL 代码,它使用正则表达式判断给定字符串是否为回文:

                        create or replace procedure palin_test(palin in varchar2) is
                         tmp varchar2(100);
                         i number := 0;
                         BEGIN
                         tmp := palin;
                         for i in 1 .. length(palin)/2 loop
                          if length(tmp) > 1 then  
                            if regexp_like(tmp,'^(^.).*(\1)$') = true then 
                              tmp := substr(palin,i+1,length(tmp)-2);
                            else 
                              dbms_output.put_line('not a palindrome');
                              exit;
                            end if;
                          end if;  
                          if i >= length(palin)/2 then 
                           dbms_output.put_line('Yes ! it is a palindrome');
                          end if;
                         end loop;  
                        end palin_test;
                        

                        【讨论】:

                          【解决方案28】:
                          my $pal='malayalam';
                          
                          while($pal=~/((.)(.*)\2)/){                                 #checking palindrome word
                              $pal=$3;
                          }
                          if ($pal=~/^.?$/i){                                         #matches single letter or no letter
                              print"palindrome\n";
                          }
                          else{
                              print"not palindrome\n";
                          }
                          

                          【讨论】:

                          • 虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。
                          【解决方案29】:

                          此正则表达式将检测最多 22 个字符的回文,忽略空格、制表符、逗号和引号。

                          \b(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*(?:(\w)[ \t,'"]*\11?[ \t,'"]*\10|\10?)[ \t,'"]*\9|\9?)[ \t,'"]*\8|\8?)[ \t,'"]*\7|\7?)[ \t,'"]*\6|\6?)[ \t,'"]*\5|\5?)[ \t,'"]*\4|\4?)[ \t,'"]*\3|\3?)[ \t,'"]*\2|\2?))?[ \t,'"]*\1\b
                          

                          在这里玩:https://regexr.com/4tmui

                          我在这里写了一个解释:https://medium.com/analytics-vidhya/coding-the-impossible-palindrome-detector-with-a-regular-expressions-cd76bc23b89b

                          【讨论】:

                          • 所以.. 如果有人想知道这是如何工作的,他们必须点击链接?这不是 Stack Overflow 的工作方式。
                          【解决方案30】:

                          Airsource Ltd 方法的轻微改进,伪代码:

                          WHILE string.length > 1
                              IF /(.)(.*)\1/ matches string
                                  string = \2
                              ELSE
                                  REJECT
                          ACCEPT
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2012-08-05
                            相关资源
                            最近更新 更多