রিকার্সিভ নিয়মিত এক্সপ্রেশনগুলি এটি করতে পারে!
একটি প্যালিনড্রোমযুক্ত একটি স্ট্রিং সনাক্ত করতে এত সহজ এবং স্ব-স্পষ্টত অ্যালগরিদম:
(\w)(?:(?R)|\w?)\1
এ rexegg.com/regex-recursion টিউটোরিয়াল ব্যাখ্যা কিভাবে এটি কাজ করে।
এটি যে কোনও ভাষার সাথে কাজ করে, এখানে পিএইচপি ব্যবহার করে একই উত্স (লিঙ্ক) থেকে প্রুফ-অফ-কনসেপ্ট হিসাবে রূপান্তরিত একটি উদাহরণ রয়েছে:
$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
o
oo
kook
book
paper
kayak
okonoko
aaaaa
bbbb
তুলনা
নিয়মিত এক্সপ্রেশন ^((\w)(?:(?1)|\w?)\2)$
একই কাজ করে তবে হ্যাঁ / পরিবর্তে "অন্তর্ভুক্ত" নয়।
পিএস: এটি এমন সংজ্ঞা ব্যবহার করছে যেখানে "ও" প্যালিমব্রোম নয়, "সক্ষম-এলবা" হাইফেনড ফর্ম্যাটটি প্যালিনড্রোম নয়, তবে "সক্ষমেলবা" is নামকরণ এটি সংজ্ঞা 1 ।
যখন "ও" এবং "সক্ষম-এলবা" প্যালিনড্রোন হয়, নামকরণ সংজ্ঞা 2 ।
অন্য একটি "প্যালিনড্রোম রেজেক্সেস" এর সাথে তুলনা করা,
^((.)(?:(?1)|.?)\2)$
\w
"সক্ষম-এলবা" স্বীকার করে কোনও বাধা ছাড়াই উপরের বেস-রেজেক্স ।
^((.)(?1)?\2|.)$
( @ লিলডেভিল ) সংজ্ঞা 2 ব্যবহার করুন ("ও" এবং "সক্ষম-এলবা" গ্রহণ করুন যাতে "আআআআআ" এবং "বিবিবিবি" স্ট্রিংগুলির স্বীকৃতি অনুসারে পৃথক হয়)।
^((.)(?1)\2|.?)$
( @ মারকাস ) "কুক" সনাক্ত করে না "বিবিবিবি"
^((.)(?1)*\2|.?)$
( @ সিসবা ) সংজ্ঞা 2 ব্যবহার করুন ।
দ্রষ্টব্য: তুলনা করতে আপনি $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";