在 AND、OR、NOT 函数的匹配中插入数组
我不知道还有比莫里茨更好的解决方案AND
.
I cover OR
below.
一种自然的写法NOT
匹配标记列表的方法是使用 a 的否定版本展望或后向断言,例如:
my $a="123 ab 4567 cde";
my @b=<23 b cd 567>;
say $_>>.pos given $a ~~ m:g/ <!before @b> /;
显示:
(0 2 3 4 6 7 9 10 11 13 14 15)
这是12场比赛的位置not 23
, b
, cd
, or 567
在字符串中"123 ab 4567 cde"
,由线所示^
下面的 s 指向匹配的每个字符位置:
my $a="123 ab 4567 cde";
^ ^^^ ^^ ^^^ ^^^
0123456789012345
我正在尝试重新执行我的程序,以匹配数组中的所有项目、匹配任意项目、不匹配项目。
这些听起来像路口,而你问题的其余部分显然都是关于路口的。如果您链接到现有程序,可能会让我/其他人更容易看到您正在尝试执行的操作。
(1)
||@b
匹配leftmost匹配令牌@b
,不是longest one.
Write |@b
,有一个single |
, 来匹配longest匹配令牌@b
。或者,更好的是,简单地写@b
,这是同一件事的简写。
这两个匹配模式(|@b
or ||@b
) 与任何其他匹配模式一样,都受正则表达式引擎工作方式的影响,如 Moritz 所简要描述的以及下面更详细的描述。
当正则表达式引擎将正则表达式与输入字符串进行匹配时,它从正则表达式的开头和输入字符串的开头开始。
如果无法匹配,它会跳过输入字符串中的第一个字符,放弃该字符,并假装输入字符串从其起始位置开始。second特点。然后它再次尝试匹配,从正则表达式的开头但输入字符串的第二个字符开始。它会重复此操作,直到到达字符串末尾或找到匹配项。
根据您的示例,引擎在开始时无法匹配123 ab 4567 cde
但成功匹配23
从第二个字符位置开始。这样就完成了——然后567
在你的匹配模式中是无关紧要的。
获得您期望的答案的一种方法:
my $a="123 ab 4567 cde";
my @b=<23 b cd 567>;
my $longest-overall = '';
sub update-longest-overall ($latest) {
if $latest.chars > $longest-overall.chars {
$longest-overall = $latest
}
}
$a ~~ m:g/ @b { update-longest-overall( $/ ) } /;
say $longest-overall;
显示:
「567」
指某东西的用途:g
下面解释。
(2)
|@b
or ||@b
主线代码中的含义与正则表达式中的含义完全无关。如你看到的,|@b
是相同的@b.Slip
. ||@b
means @b.Slip.Slip
其评估结果为@b.Slip
.
进行“平行”最长比赛模式获胜OR
的元素的@b
, write @b
(or |@b
) 在正则表达式中.
进行“顺序”最左匹配模式获胜OR
的元素的@b
, write ||@b
在正则表达式内。
到目前为止我一直无法弄清楚什么&
and &&
do 当用于在正则表达式中为数组添加前缀时。在我看来,有多个与它们的使用相关的错误。
在您问题的某些代码中,您指定了:g
副词。这指示引擎在找到匹配项时不会停止,而是跳过刚刚匹配的子字符串,并开始尝试在输入字符串中进一步匹配。
(还有其他副词。the:ex
副词是最极端的。在这种情况下,当输入字符串中的给定位置存在匹配项时,引擎会尝试匹配任何其他匹配模式在同一个位置在正则表达式和输入字符串中。无论积累了多少匹配项,它都会继续执行此操作,直到尝试了正则表达式和输入字符串中该位置的所有最后可能的匹配项。只有当它用尽所有这些可能性时,它才会在输入字符串中向前移动一个字符,并再次尝试彻底匹配。)
(3)
我最好的镜头:
my $a="123 ab 4567 cde";
my @b=<23 b cd 567>;
my &choose = &any;
say so choose do for @b -> $z {
$a ~~ / { say "==>$a -->$z"; } $z /
}