regex - perl6 空匹配对象为 True?将 Set.one/all 变量插入正则表达式

标签 regex set interpolation raku

做事有不同的方式。我想要做的是(A)匹配集合中的任何模式,以及(B)以任何顺序匹配集合中的所有模式。例如,如果一个集合是 (1,2,3),则如果字符串包含 1、2、或 3,则 (A) 为真;如果字符串包含任意顺序的 1、2 和 3,则 (B) 为 true。

不久前,smls 使用数组回答了一个问题:perl6 Is using junctions in matching possible? (谢谢短信);但这一次我想使用 Set,如果可能的话使用 .one 和 .all,因为使用 Set 可以显着简化程序的其他部分。

我正在使用七月版的 Rakudo。这是一份文字记录。谢谢!!!

To exit type 'exit' or '^D'
> my $a = < one two 3 >
(one two 3)
> do "two" ~~ $a.one
True
> so 4 ~~ $a.one
False
> so "zzzonezz" ~~ $a.one
False
> my $b = "one"
one
> so "zzonezz" ~~ m/ {$b} /         # trying to interpolate into regex
True
> so "zzzonezz" ~~ m/ { $a.one } /  # trying to interpolate into regex
True
> say "zzzonezz" ~~ m/ { $a.one } /
「」                                  # empty match is True ?????
> my $c = "zzzonezz" ~~ m/ { $a.one } /
「」                                # why is the match empty and not "one"?
> so "zzonezz" ~~ m/ $b /
True
> my $c = "zzzonezz" ~~ m/ $a.one / # $b above is evaluated, 
# how come this one isn't evaluated ??
# why either /{$b}/ or /$b/ works, but only /{$a.one}/ works and
# /$a.one/ doesn't ???
False
> so "xxonetwo3xx" ~~ m/ { $a.all } /
True
> so "xxone 3 twoxx" ~~ m/ { $a.all } / # seems to work
True
> so "xxone 3 twoxx" ~~ m/  $a.all  / 
False

最佳答案

原因m/ {$b} /匹配也是同理m/ {False} /火柴。正则表达式中的普通裸 block (通常)不会影响它是否匹配。

基本上m/ {} /是一个空正则表达式,就好像您使用了 m/ '' / .


在这种情况下你想要的是使用 <{…}>

my $a = < one two 3 >;
my $b = "one";

so "zzonezz" ~~ m/ $b /; # True
so "zz   zz" ~~ m/ $b /; # False

so "zzonezz" ~~ m/ <{ $b }> /; # True
so "zz   zz" ~~ m/ <{ $b }> /; # False

$a为例您需要做的就是添加 @到它。 (或将其命名为 @a )

so "zzonezz" ~~ m/ @$a /; # True
so "zz   zz" ~~ m/ @$a /; # False

so "zzonezz" ~~ m/ <{ @$a }> /; # True
so "zz   zz" ~~ m/ <{ @$a }> /; # False

或者做其他事情来取消逐项列出。

so "zzonezz" ~~ m/ <{ $a.list }> /; # True
so "zz   zz" ~~ m/ <{ $a.list }> /; # False

你也可以做这样的事情。

so "zzonezz" ~~ m/ .*? <?{ $/ ~~ $a.one }> /; # True
so "zz   zz" ~~ m/ .*? <?{ $/ ~~ $a.one }> /; # False

请注意<?{…}>是一个零宽度断言,如果结果为真则成功。
还有<!{…}>效果恰恰相反。


要使用Set,目前您需要调用.keys方法将其放入列表中。

my $c = $a.Set;

so "zzonezz" ~~ m/ @( $c.keys ) /; # True
so "zz   zz" ~~ m/ @( $c.keys ) /; # False

so "zzonezz" ~~ m/ <{ $c.keys }> /; # True
so "zz   zz" ~~ m/ <{ $c.keys }> /; # False

关于regex - perl6 空匹配对象为 True?将 Set.one/all 变量插入正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46213618/

相关文章:

bash - 在 bash 中,如何获取 set -x 的当前状态?

python - 不均匀采样角度值的二维插值/平滑

php - is_numeric、intval、ctype_digit .. 你可以依赖它们吗?

java - 多次查找两个字符串之间的所有字符串

正则表达式无法识别带有特殊字符的电子邮件?

javascript - 在javascript中替换子字符串的最简单方法

Python - 从另一个列表中删除一组列表

Python freezeset 散列算法/实现

c++ - GLSL:如何访问附近的顶点颜色? (没有制服的双线性插值)

Python Pandas - 使用 interpolate() 将一列的 NaN 值替换为另一列