>=1.9
)的好文章,链接在这里:http://pragprog.com/magazines/2010-12/whats-new-in-ruby- - user131441虽然PCRE引擎支持递归正则表达式(请参见Peter Krauss的答案),但你不能在ICU引擎上(例如由苹果使用)使用正则表达式来实现此功能而无需额外的代码。您需要像这样执行:
这会检测任何回文,但确实需要一个循环(因为正则表达式不能计数)。
$a = "teststring";
while(length $a > 1)
{
$a =~ /(.)(.*)(.)/;
die "Not a palindrome: $a" unless $1 eq $3;
$a = $2;
}
print "Palindrome";
不可能。回文并未由正则语言定义。(看,我在计算理论中确实学到了一些东西)
使用 Perl 正则表达式:
/^((.)(?1)\2|.?)$/
尽管许多人已经指出,如果您想严格要求,这不能被视为正则表达式。正则表达式不支持递归。
虽然许多人已经指出,如果你想严格要求的话,这不能算作一个正则表达式。正则表达式不支持递归。
anna
, aa
这样的字符串。将其修改为 ^((\w)(?:\2*$|(?:(?1)|\w?)\2))$
。而且Casimirs Regex不使用递归也可以很好地工作,除了不能匹配单个字符,但这可能是有意的。 - bobble bubbleabababa
。使用基于PCRE的正则表达式引擎时,不可能为每个输入都使用递归使其工作。
Casimir的正则表达式采用了不同的方法,使用迭代和可变状态,非常迷人。 - Markus Jarderot根据您的信心水平,我会给出这个答案:
我不会用正则表达式来完成。这不是正则表达式的恰当使用方式。
话虽如此,您可以使用正则表达式匹配回文,方法如下:由于文章比较长,以下是主要内容的摘要:
- 程序员使用的“正则表达式”与形式语言理论中原始概念的“规则性”几乎没有任何关系。
- 正则表达式(至少PCRE)可以匹配所有上下文无关的语言。因此,它们也可以匹配格式良好的HTML和几乎所有其他编程语言。
- 正则表达式可以匹配至少一些上下文有关的语言。
- 正则表达式的匹配是NP完全问题。因此,您可以使用正则表达式解决任何其他NP问题。
^(?'letter'[a-z])+[a-z]?(?:\k'letter'(?'-letter'))+(?(letter)(?!))$
正如一些人已经说过的那样,没有一个单一的正则表达式可以直接检测出通用回文,但是如果你想检测某个长度范围内的回文,你可以使用以下代码:
(.?)(.?)(.?)(.?)(.?).?\5\4\3\2\1