Ekspresi Reguler Rekursif dapat melakukannya!
Algoritme yang sangat sederhana dan terbukti dengan sendirinya untuk mendeteksi string yang berisi palindrome:
(\w)(?:(?R)|\w?)\1
Di rexegg.com/regex-recursion , tutorial menjelaskan cara kerjanya.
Ini berfungsi dengan baik dengan bahasa apa pun, berikut contoh yang diadaptasi dari sumber yang sama (tautan) sebagai bukti-konsep, menggunakan 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";
}
keluaran
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
Perbandingan
Ekspresi reguler ^((\w)(?:(?1)|\w?)\2)$
melakukan pekerjaan yang sama, tetapi sebagai yes / not, bukan "berisi".
PS: menggunakan definisi di mana "o" bukan palimbrome, format "dapat-elba" dengan tanda hubung bukan palindrome, tetapi "ableelba "adalah. Menamainya definisi1 .
Ketika "o" dan "mampu-elba" adalah palindrones, definisi penamaan2 .
Membandingkan dengan "palindrome regexes" lainnya,
^((.)(?:(?1)|.?)\2)$
basis-regex di atas tanpa \w
batasan, menerima "mampu-elba".
^((.)(?1)?\2|.)$
( @LilDevil ) Gunakan definisi2 (menerima "o" dan "mampu-elba" sehingga membedakan juga dalam pengenalan string "aaaaa" dan "bbbb").
^((.)(?1)\2|.?)$
( @Markus ) tidak terdeteksi "kook" dan "bbbb"
^((.)(?1)*\2|.?)$
( @Csaba ) Gunakan definisi2 .
CATATAN: untuk membandingkan Anda dapat menambahkan lebih banyak kata di $subjects
dan satu baris untuk setiap ekspresi reguler yang dibandingkan,
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";