正規表現を使用して文字列が回文であることを確認するにはどうすればよいですか?


93

それは私が答えることができなかったインタビューの質問でした:

正規表現を使用して文字列が回文であることを確認するにはどうすればよいですか?

psすでに「指定された文字列が回文かどうかを確認する方法は?」という質問があり、さまざまな言語で多くの回答が得られますが、正規表現を使用する回答はありません。


1
stackoverflow.com/questions/3644266/…アイデアを与えることができます。
Prakhar

2
今日(2018年)で、「回文の正規表現」を探している人は、Prakharのリンクで再帰パターンをサポートするPCREについての議論と、以下の比較付きの再帰正規表現を参照してください
Peter Krauss

回答:


151

この質問への答えは「不可能」です。より具体的には、インタビュアーはあなたが計算理論のクラスで注意を払ったかどうか疑問に思っています。

計算理論のクラスでは、有限状態機械について学びました。有限状態機械はノードとエッジで構成されています。各エッジには、有限のアルファベットの文字で注釈が付けられています。1つ以上のノードが特別な「受け入れ」ノードであり、1つのノードが「開始」ノードです。各文字は特定の単語から読み取られるため、マシンの特定のエッジをトラバースします。受け入れ状態になると、マシンはその単語を「受け入れる」と言います。

正規表現は、常に同等の有限状態マシンに変換できます。つまり、正規表現と同じ単語を受け入れたり拒否したりします(現実の世界では、一部の正規表現言語では任意の関数を使用できますが、これらはカウントされません)。

すべてのパリンドロームを受け入れる有限状態機械を構築することは不可能です。証明は、任意の数のノードを必要とする文字列、つまり文字列を簡単に作成できるという事実に依存しています

a ^ xba ^ x(例:aba、aabaa、aaabaaa、aaaabaaaa、...)

ここで、a ^ xはx回繰り返されます。「b」が表示された後、回文であることを確認するためにx回カウントする必要があるため、これには少なくともxノードが必要です。

最後に、元の質問に戻り、有限の固定長より小さいすべてのパリンドロームを受け入れる正規表現を記述できることをインタビュアーに伝えることができます。パリンドロームの特定を必要とする現実のアプリケーションがある場合、それはほぼ確実に任意の長さのものを含まないため、この回答は、理論的な不可能性を現実のアプリケーションと区別できることを示しています。それでも、実際の正規表現はかなり長く、同等の4行プログラムよりもはるかに長くなります(読者にとって簡単な練習:回文を識別するプログラムを作成してください)。


6
@SteveMoser Ruby 1.9.xでは、正規表現は(オートマトン理論の意味で)正規ではなくなり、パリンドロームのチェックなどが可能になりました。しかし、意図や目的のために、パリンドロームはで確認することができない通常の正規表現(メイク感覚?)。

1
@SteveMoser Rubyの正規表現エンジン(>=1.9)の良い記事がここにあります

@ジョンは正しいので、質問の文脈ではホセは正しいですし、hqtは間違っています。
Steve Moser

2
学術用語では、正規表現には特定の境界があります(DFAを定義します)。実際には、多くの正規表現エンジン(Perlとその親類)は、学術的定義(NFAまたはそれ以上)に違反する後方参照をサポートしています。したがって、この質問は、質問者の参照フレームが何であったかに応じて、異なる答えを持っています。
ジギー14

口頭テストではzou shoulsdは「formalzそれは不可能です」と行きますが、一部の正規表現エンジンでは許可されていることを指摘しておく必要があります。
Oliver A.

46

一方でPCREのエンジンがサポート再帰的な正規表現を(参照しピーター・クラウスによって答えを)、あなたは上の正規表現を使用することはできませんICUの余分なコードなしでこれを達成するために(例えば、Appleが使用されるような)エンジン。次のようなことをする必要があります:

これはパリンドロームを検出しますが、ループが必要です(正規表現がカウントできないため、ループが必要になります)。

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

4
いい答えだ。質問は、そのままパリンドロームを検出する単一の正規表現を要求するのではなく、正規表現を使用する回文を検出する方法を単に要求しました。このようにそれを見るあなたの洞察をおめでとうございます。
スチュワート

1
1つの正規表現のみを使用した最も単純なマッチング(文字列操作なし)も参照してください
Peter Krauss

@PeterKraussに感謝します。PCREに再帰があったことを知りませんでした。あなたの答えを参照しました。
Airsource Ltd

32

不可能です。回文は通常の言語では定義されていません。(参照、私は計算理論で何かを学びました)


2
ほとんどの正規表現エンジンは、通常の言語よりも多くをキャプチャします(たとえば、netは一致する括弧をキャプチャできます)。標準の正規表現だけが通常の言語に制限されています。
サンティアゴパラディーノ

質問では「正規表現」という用語を使用しましたが、ZCHudsonの答えは正しいです。
paxos1977 2008年

2
@austirg:ZCHudsonの答えは正しいですが不完全です。現代のプログラミング言語で使用されている正規表現と、理論上のCSクラスで使用されている正規表現は、別のものです。用語は単なる歴史的遺産です。stackoverflow.com/questions/233243#235199と私の回答を参照してください。
jfs 2008年

2
@JFセバスチャン-私はこれについてaustirgに同意する必要があります。正規表現という用語が特定のプログラミング言語なしで使用されている場合、comp sciの定義が適用されます。正規表現をサポートするすべての言語がこれを実行できるわけではないので、ここで使用されている言語がそうであると想定すべきではありません。
Rontologist 2008年

@Rontologist:問題のプログラミング言語の選択に制限はないので、どの言語でも許可されます。右を見てください。関連する質問における「正規表現」の意味は何ですか?それらのいずれかで特定のプログラミング言語が言及されていますか?
jfs 2008年

27

Perl正規表現の場合:

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

多くの人が指摘したように、厳密にしたい場合、これは正規表現とは見なされません。正規表現は再帰をサポートしていません。


これはPCREでは機能しません(「ababa」とは一致しません)が、Perl 5.10では機能します
newacct

あなたが正しいです。PCREは再帰をアトミックグループとして扱いますが、Perlは再帰をその中で追跡できます。PCREでこのチェックを行うことはできないと思います。
Markus Jarderot、2009年

1
驚いたことに、アルメニア語などの非ラテン語では機能しません。
テムジン

3
@Temujinこれは、Unicode文字がエンコードされたバイトと一致するため(/u修飾子を追加)、またはコンビネーター文字のためです。(置き換える.\Xエスケープシーケンス)。
Markus Jarderot

1
PCREでパターンが機能しません。Perlで動作します。サブストリングが繰り返されると、パターンが失敗します。例えばabababa。PCREベースの正規表現エンジンを使用する場合は、すべての入力に対して再帰を使用して機能させることはできません。Casimirs regexは、反復と可変状態を使用する別のアプローチを使用しており、非常に魅力的です。
Markus Jarderot、

15

ここだ文字の任意のタイプのために、:(行為など)4文字の回文を検出するために、1を:

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

ここだ文字のみをチェックし、5文字の回文(レーダーなど)を検出するための一つは:

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

したがって、考えられる単語の長さごとに異なる正規表現が必要なようです。 Pythonメーリングリストに関するこの投稿には、理由(Finite State Automataおよびpumping lemma)に関する詳細が含まれています。


14

あなたがどれだけ自信があるかに応じて、私はこの答えを出します:

正規表現ではできません。正規表現の適切な使用ではありません。


3
正規表現の限界を本当に理解していることを示すために、もう少し説明をお願いします。あなたの簡単な答えは「困惑している」と解釈されるかもしれません。
スコットウェグナー

したがって、彼が与えた従属節。
ビックフォード、

13

はい、あなたはそれを.Netで行うことができます!

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

こちらでチェックできます!素晴らしい投稿です!


.NET風のRegexの重要な点は、有限状態オートマトンではないため、正規表現ではないということです。それらは理論的には正規表現ではありません。

12

StackOverflowには、「正規表現?いいえ、サポートされていません。サポートできません。」などの回答が満載です。

真実は、正規表現がもはや正規の文法とは何の関係もないということです。最新の正規表現は、再帰やバランスグループなどの機能を備えており、それらの実装の可用性はますます高まっています(たとえば、Rubyの例を参照してください)。私の意見では、私たちの分野の正規表現はプログラミングの概念以外のものであるという古い信念にぶら下がっています。もはや最も適切ではない単語の選択を彼らに嫌うのではなく、物事を受け入れて次に進む時がきました。

これは、Perl自体の作成者であるLarry Wallから引用です。

(…)一般に、「正規表現」と呼ばれるものと関係があります。これは、実際の正規表現にわずかに関連しているだけです。それにもかかわらず、この用語はパターンマッチングエンジンの機能によって拡大したため、ここでは言語の必要性に対抗するつもりはありません。しかし、私は一般的にそれらを「正規表現」(または私がアングロサクソンムードにいるときは「正規表現」)と呼びます。

そして、PHPのコア開発者の1人によるブログ投稿次のとおりです。

記事がかなり長かったので、ここで主なポイントの要約を示します。

  • プログラマーが使用する「正規表現」は、正式な言語理論の文脈における規則性の元の概念との共通点がほとんどありません。
  • 正規表現(少なくとも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


6

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 

1
名前付きキャプチャグループは厳密には正規表現ではありません。willamette.edu/~fruehr/LLC/lab5.html
スティーブモザー

2
あなたは正しいです。これが、名前付きキャプチャグループを使用する必要があると私が指摘した理由です。
テイラー

初心者のために、誰かがそのREをキャラクターごとに説明することはありますか?次のすべてを理解しています(カンマで「原子」を区切ります)/、\ A、(、|、\ w、|、(、(、\ w、)、)、)、\ z、/、xがわかりませんこれらのいずれも理解できません?<p>、?:、?<l>、\ g <p>、\ k <l + 0>そして私は助けとしてrubular.comを使用しており、REを理解しているようです(当然ですが、それでも私にはわかりません。「Ruby regexの完全なガイドについては、つるはしを参照してください。」「Pickaxe」にリンクされているサイトは理解できない原子を説明していないため、助けにはなりません。知っている ?aをフォローすると、ゼロまたはaのいずれかに一致しますが、?キャラクターの前?
ケビンフォード

ああ、名前付きのキャプチャグループ!いいね。@SteveMoserはリンク切れになりましたが、別のリンクが見つかりまし。それらについて言及してくれたTaylorに感謝します。そうでない場合、私は?<p>と?<l>と?:(非キャプチャーキャプチャグループ)と\ g <p>と\ k <l +の意味がわからなかっただろう。 0>。まだ何も見えませんか?<p> | ですが。しない| 「または」を意味しますか?REでのパイプの使用法に関するドキュメントが見つかりません。この非常に優れたREの詳細な説明を見て、私はまだ喜んでいます。
ケビンフォード

5

実際には、正規表現よりも文字列操作の方が簡単です。

bool isPalindrome(String s1)

{

    String s2 = s1.reverse;

    return s2 == s1;
}

これはインタビューの質問には実際には答えませんが、タスクを実行するためのより良い方法をどのようにして知っているかを示すために使用でき、あなたはすべての問題を釘として見る典型的な「ハンマーを持つ人」ではありません。 」


私はこの答えがとても好きですが、BreakIteratorを使用して文字列を適切に視覚的な文字に分割すると、余分なポイントが得られると思います。
Trejkaz 2014年

5

これが、Regex Golfの5番目のレベル(男性、計画)に対する私の答えです。ブラウザーの正規表現で最大7文字まで機能します(Chrome 36.0.1985.143を使用しています)。

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

これは最大9文字の1つです

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

機能する最大文字数を増やすには、。?を繰り返し置き換えます。(?。。?:()\ nは?)?


1
^(。)(。)(。)?。?\ 3 \ 2 \ 1 $を少し少ない文字で管理しました
Ben Ellis

私にそれを台無しにしてくれてありがとう:-)
U10-Forward

残りの人々が13を持っているのになぜこれが19であるのか
U10-Forward

5

再帰的な正規表現がそれを行うことができます!

回文を含む文字列を検出する非常にシンプルで自明のアルゴリズム:

   (\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)$ は同じ働きをしますが、はい/いいえの代わりに「含む」。
PS:「o」が回文ではない定義を使用しています。「able-elba」のハイフン付き形式は回文ではありませんが、「ableelba」はそうです。定義に名前を付ける1
「o」と「able-elba」が回文式の場合は、definition2という名前を付けます

別の「パリンドローム正規表現」と比較すると、

  • ^((.)(?:(?1)|.?)\2)$上記の基本正規表現は\w制限なしで、「able-elba」を受け入れます。

  • ^((.)(?1)?\2|.)$@LilDevildefinition2を使用します(「o」と「able-elba」を受け入れるため、「aaaaa」と「bbbb」の文字列の認識も異なります)。

  • ^((.)(?1)\2|.?)$@Markus)「kook」も「bbbb」も検出されない

  • ^((.)(?1)*\2|.?)$@Csabadefinition2を使用します


注:比較する$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";

5

再帰を使用せずにそれを行うこともできます:

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

単一の文字を許可するには:

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

Perl、PCREで動作

デモ

Javaの場合:

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

デモ


1
これは正規表現の質問に対する非常に興味深い回答です。実際には、私のテストのいくつかに合格した唯一のパターンです。この1つのカシミールをありがとう:)
ボブルバブル'18

1
@bobblebubble:ご協力ありがとうございます。ご覧のとおり、以前のバージョンが間違っていたので、この回答を最近編集しました(3年間、なんて残念なことです)。
Casimir et Hippolyte

4

PCREの式について(MizardXから):

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

あなたはそれをテストしましたか?Win XP Proでの私のPHP 5.3では失敗します:aaaba実際、私は次のように式の式を少し変更しました:

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

何が起こっているのかと思いますが、外側の文字のペアは固定されていますが、残りの内側の文字は固定されていません。「aaaba」と「aabaacaa」は誤って渡されますが、「aabaaca」では正しく失敗しないため、これは完全な答えではありません。

これの修正はありますか、また、Perlの例(JF Sebastian / Zsoltによる)は私のテストに正しく合格しますか?

ウィーン発クサバガボール



3

Perlでは(Zsolt Botykaiの回答も参照):

$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
}

2

ZCHudsonによって指摘されたように、パリンドロームのセットは通常の言語ではないため、何かがパリンドロームであるかどうかを判断し、通常の正規表現では実行できません。

Airsource Ltd が「不可能だ」とはインタビュアーが求めている種類の答えではないと彼が言ったとき、私は完全に反対します。面接の際、良い候補に直面したときにこの種の質問をし、私たちが何か間違ったことを提案したときに正しい議論を見つけることができるかどうかを確認します。私は彼がより良いものを知っているなら間違った方法で何かをしようとする誰かを雇いたくありません。



2

パリンドロームで構成される言語は通常の言語ではなく、文脈自由であることをインタビュアーに説明します。

すべてのパリンドロームに一致する正規表現は無限です。代わりに、彼は自分が受け入れることのできるパリンドロームの最大サイズに制限することをお勧めします。または、すべてのパリンドロームが必要な場合は、少なくとも一部のタイプのNDPAを使用するか、単純な文字列反転/等しい手法を使用します。


2

キャプチャグループが不足する前に、正規表現を使用して実行できる最善の方法:

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

これは、長さが19文字までのすべてのパリンドロームと一致します。

すべての長さをプログラムで解決するのは簡単です。

str == str.reverse ? true : false

あなたの正規表現は機能しません。たとえば、 "abac"が一致することを示します...
Darwin Airola

2

インラインでコメントする担当者はまだいませんが、MizardXによって提供され、Csabaによって変更された正規表現をさらに変更して、PCREで機能させることができます。私が見つけた唯一の失敗は単一文字の文字列ですが、それを個別にテストできます。

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

他の文字列で失敗する可能性がある場合は、コメントしてください。


2
#!/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";

2

オートマトン理論から、あらゆる長さのパリアンドロームと一致させることは不可能です(無限のメモリを必要とするため)。ただし、固定長のPaliandromesと一致させることは可能です。長さが<= 5または<= 6などのすべてのパリアンドロームに一致するが、上限が不明な> = 5などには一致しない正規表現を書くことが可能だとしましょう


2

Rubyでは、\b(?'word'(?'letter'[a-z])\g'word'\k'letter+0'|[a-z])\bなどの回文の単語を照合するために使用できますa, dad, radar, racecar, and redivider。ps:この正規表現は、奇数文字長の回文語にのみ一致します。

この正規表現がレーダーに一致する方法を見てみましょう。単語境界\ bは文字列の先頭で一致します。正規表現エンジンがキャプチャグループ「単語」に入ります。[az]はrと一致し、再帰レベル0でキャプチャグループ "letter"のスタックに格納されます。これで、正規表現エンジンがグループ「単語」の最初の再帰に入ります。(? 'letter' [az])は、再帰レベル1のaに一致してキャプチャします。正規表現は、グループ「単語」の2番目の再帰に入ります。(? 'letter' [az])は、再帰レベル2でdをキャプチャします。次の2回の再帰の間に、グループはレベル3と4でaとrをキャプチャします。[az]に一致する文字が文字列に残っていないため、5回目の再帰は失敗します。正規表現エンジンはバックトラックする必要があります。

正規表現エンジンは、グループ「単語」内で2番目の代替案を試す必要があります。正規表現の2番目の[az]は、文字列の最後のrと一致します。これで、エンジンは正常な再帰を終了し、1つのレベルから3番目の再帰に戻ります。

(&word)に一致した後、エンジンは\ k'letter + 0 'に到達します。正規表現エンジンがすでに件名の文字列の終わりに達しているため、後方参照は失敗します。そのため、もう一度バックトラックします。2番目の選択肢はaに一致します。正規表現エンジンは3番目の再帰を終了します。

正規表現エンジンは再び一致し(&word)、後方参照を再度試行する必要があります。後方参照は+0または現在の再帰レベル(2)を指定します。このレベルでは、キャプチャグループはdに一致しました。文字列の次の文字がrであるため、後方参照は失敗します。再びバックトラックすると、2番目の代替案はdに一致します。

これで、\ k'letter + 0 'は文字列の2番目のaと一致します。これは、正規表現エンジンが、キャプチャグループが最初のaと一致する最初の再帰に戻ったためです。正規表現エンジンは最初の再帰を終了します。

正規表現エンジンは、すべての再帰の外に戻っています。このレベルでは、キャプチャグループはrを格納しました。後方参照は、文字列の最後のrと一致できるようになりました。エンジンはもはや再帰の中にないので、グループの後の正規表現の残りを続行します。\ bは文字列の最後に一致します。正規表現の終わりに達し、全体的な一致としてレーダーが返されます。


2

これは、指定された文字列が回文かどうかを正規表現を使用して示す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;

2
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";
}

2
このコードは質問に答えることがありますが、問題を解決する方法や理由に関する追加のコンテキストを提供すると、回答の長期的な価値が向上します。
ドナルドダック

2

この正規表現は、スペース、タブ、コンマ、引用符を無視して、最大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


0

擬似コードでのAirsource Ltdのメソッドのわずかな改良:

WHILE string.length > 1
    IF /(.)(.*)\1/ matches string
        string = \2
    ELSE
        REJECT
ACCEPT
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.