gpt4 book ai didi

语法正则表达式独立匹配但不匹配

转载 作者:行者123 更新时间:2023-12-01 13:13:24 26 4
gpt4 key购买 nike

这是我解决每周挑战“实现大括号扩展”的尝试。我在下面写了语法,应该可以。但是没有。

grammar BraceExpansion
{
regex TOP { <start-txt> <to-expand> <end-txt> }
regex start-txt { <save-char>* }
regex end-txt { <save-char>* }
token save-char { <-[ \" \& \( \) \` \' \; \< \> \| ]> }
token list-element { <-[ \" \! \$ \& \( \) \` \' \; \< \> \| ]> }
token alphanum { <[ a..z A..Z 0..9 ]> }
token alpha { <[ a..z A..Z ]> }
regex num { \-? <[ 0..9 ]>+ }
regex to-expand { <range> | <list> }
regex range { <alpha-range> | <num-range> }
regex num-range { \{ <num> \. \. <num> [ \. \. <num> ]? \} }
regex alpha-range { \{ <alpha> \. \. <alpha> [ \. \.<num> ]? \} }
regex list { \{ <list-element>+ % ',' \} }
}

say brace-expand( 'A{1..3}B{a..g..3}C{1,2}D' );

sub num-range( $match )
{
say "-NUM-";
my @num = |$match<range><num-range><num>.list>>.Int;
my @range = @num[0] ... @num[1];
my $steps = ( @num[2] // 1 ).abs;
@range.batch( $steps )>>.[0];
}


sub alpha-range( $match )
{
say "-ALPHA-";
my @num = |$match<range><alpha-range><alpha>.list>>.Str;
my @range = @num[0] ... @num[1];
my $steps = ( $match<range><alpha-range><num> // 1 ).abs;
@range.batch($steps)>>.[0];
}

sub list( $match )
{
say "-LIST-";
$match<list><list-element>.list>>.Str;
}

sub brace-expand( $str )
{
say "brace-expand( $str )";

my $match = BraceExpansion.parse( $str );

my @alternatives =
$match<range><num-range> ?? num-range( $match ) !!
$match<range><alpha-range> ?? alpha-range( $match ) !!
$match<list> ?? list( $match ) !!
();

say "A", @alternatives;

return $str
unless @alternatives;

@alternatives
.map( -> $element { $match<start-txt>.Str ~ $element ~ $match<end-txt>.Str } )
.map( -> $result { brace-expand( $result ) } )
;
}

但是,如果我将 TOP 规则更改为

    regex TOP          { <start-txt> <range> <end-txt> }

    regex TOP          { <start-txt> <list> <end-txt> }

rangelist token 独立工作,我得到了我期望的输出。但是当我使用 to-expand规则,整个语法不匹配,我不知道为什么。改错了吗?但如果是这样,那为什么会 <alpha-range> | <num-range>工作?

....(时间流逝)....

同时我发现

regex TOP           { <start-txt> [ <range> | <list> ] <end-txt> } 

做我想做的。但我的问题仍然存在,为什么它不像上面那样工作?

最佳答案

比赛进行得很顺利;您没有正确索引匹配项。结果匹配的结构是:

start-txt => 「A{1..3}B{a..g..3}C」
save-char => 「A」
...
to-expand => 「{1,2}」
list => 「{1,2}」 # (or range)
...
end-txt => 「D」
save-char => 「D」
...

但是你正在像 $match<list> 这样索引这个.您应该首先索引到 <to-expand>喜欢$match<to-expand><list> . Try it online!

修改版本起作用的原因是您要删除 to-expand 的中间步骤以便索引起作用。

关于语法正则表达式独立匹配但不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58346426/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com