量词量化的是什么?但我从未请求使用量词。

3

考虑以下Perl风格的正则表达式(我想不是吧?)用于测试字符串是否为回文

^((.)(?1)\2|.?)$
在此处尝试

以下内容:

my regex palindrome {
    ^((.)(?1)\2|.?)$
}

say "$word is a palindrome"
    if $word ~~ /<palindrome>/
    && $word.chars > 1;

出现了错误

===SORRY!===
Quantifier quantifies nothing
at /home/cat/projects/perl6/code/misc/words.pl6:6
------>   ^((.)(?⏏1)\2|.?)$
Unrecognized backslash sequence (did you mean $1?)
at /home/cat/projects/perl6/code/misc/words.pl6:6
------>   ^((.)(?1)\2⏏|.?)$

我了解(Python)正则表达式的工作原理,知道“量词未能量化”表示什么,但我不明白为什么它会在我要求递归而非量化的情况下出现这种情况。
我对Perl的知识不足以知道为什么它不喜欢反斜杠(另一种错误)。
我尝试改变语法并搜索相关信息,但据我所知,这个正则表达式是有效的。当我尝试改动时,出现了其他各种我无法理解的错误。
请问我哪里做错了?

5
目前在 Meta 上有一个讨论,关于是否可以在 Perl 6 的问题中添加 "perl" 标签,但请务必始终包含 "perl6" 标签。否则,你会让所有 Perl 5 开发人员感到困惑,他们会想知道为什么你的代码看起来如此奇怪。 - ThisSuitIsBlackNot
3
(?1) 不是 Perl 6 中的有效语法结构。Perl 6 正则表达式与 PCRE 完全不同。 - hobbs
1
(?1)是Perl 5正则表达式中的递归子模式,而不是命名捕获组。我不确定如何将其转换为Perl 6正则表达式(或者是否可以使用正则表达式完成),但这里有Perl 6正则表达式文档。请注意,绝大多数关于Perl的问题都是关于Perl 5的,并且尝试在Perl 6中运行Perl 5代码通常不会成功。 - ThisSuitIsBlackNot
2
根据此页面,使用<~~>可以递归地匹配整个正则表达式,或者您可以指定一个编号(<~~0>)或命名(<~~foo>)的子模式。 - Alan Moore
2
@WiktorStribiżew:捕获组索引是从0开始的,而对于捕获组的~~断言尚未实现... - Christoph
显示剩余4条评论
1个回答

6

其中一种方法是这样的:

my regex palindrome { (.) <~~> $0 || .? }
say "aba" ~~ /^<palindrome>$/;

这个程序考虑了每个单词是否是回文。 - cat
1
@cat: 不是给我用的;你的Rakudo版本是多少? - Christoph
我仍然使用2015.12-113版本,所以我会进行更新并查看发生了什么;你的代码可能出现问题的原因在其他地方吗? - Christoph
1
$ perl6 -e 'my regex palindrome { (.) <~~> $0 || .? }; say "ab" ~~ /^<palindrome>$/' # Nil - Christoph
3
哦!在应用正则表达式时我漏掉了 ^$ 。我的错误,你是正确的。 - cat
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接