if($istr =~ /^((\w)(?1)\g{-1}|\w?)$/){
print $istr," is palindrome\n";
}
基于最近的一部分进行修改 http://perldoc.perl.org/perlretut.html
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
(?<p>|
.. 语法只是表示允许匹配空值或其他备选项的剩余部分。而 (?<p>..)
语法则是一个命名捕获组,可以使用 \k<p>
引用精确匹配,而不是引用组号。+0
表示在相同递归级别上。 - Scratte检测包含回文字符串的简单而自明的算法:
(\w)(?:(?R)|\w?)\1
$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”是回文时,命名为定义2。
与另一个“回文正则表达式”进行比较,
^((.)(?:(?1)|.?)\2)$
是基本正则表达式,没有\w
限制,接受“able-elba”。
^((.)(?1)?\2|.)$
(@LilDevil) 使用定义2(接受“o”和“able-elba”,因此在识别“aaaaa”和“bbbb”字符串方面也有所不同)。
^((.)(?1)\2|.?)$
(@Markus) 未检测到“kook”和“bbbb”
^((.)(?1)*\2|.?)$
(@Csaba) 使用定义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";
这是我对Regex Golf的第五关(一个男人,一个计划)的答案。它适用于浏览器的正则表达式,最多可匹配7个字符(我使用的是Chrome 36.0.1985.143)。
^(.)(.)(?:(.).?\3?)?\2\1$
^(.)(.)(?:(.)(?:(.).?\4?)?\3?)?\2\1$
实际上,使用字符串操作比正则表达式更容易:
bool isPalindrome(String s1)
{
String s2 = s1.reverse;
return s2 == s1;
}
$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
}
以下是使用正则表达式判断给定字符串是否为回文字符串的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;
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";
}