9

有时我有一个很长的列表,我想检查一个字符串是否与列表中的任何内容匹配。我正在尝试在正则表达式中插入一个连接。它们都是错误的。

say "12345" ~~ m/ <{ (2,3,4).any }> /
Cannot resolve caller MAKE_REGEX(Int, Bool, Bool, Int, PseudoStash); none of these signatures match:

say "12345" ~~ m/ $( (2,3,4).any ) /
This type cannot unbox to a native string: P6opaque, Junction

此错误消息是否意味着无法在正则表达式插值中使用交汇点?

我的解决方法是

say "12345" ~~ m/ <{ (2,3,4).join("||") }> /
「2」

如何在正则表达式插值中使用联结?

4

1 回答 1

10

有时我有一个很长的列表,我想检查一个字符串是否与列表中的任何内容匹配。

使用列表,而不是 Junction:

my @list = <bar bartoo baragain>;
say 'bartoo' ~~ / @list /;                         # 「bartoo」
say 'bartoo' ~~ / <{<bar bartoo baragain>}> /;     # 「bartoo」

请注意,默认情况下,您会获得最长的匹配令牌。

我正在尝试在正则表达式中插入一个连接。它们都是错误的。...此错误消息是否意味着不能在正则表达式插值中使用交汇点?

我认同。(错误消息可能是 LTA。)连接是主要 P6 语言的一个特性。模式匹配DSL不支持它们似乎是合理的。

我的解决方法是

say "12345" ~~ m/ <{ (2,3,4).join("||") }> /
「2」

如果您使用双管 ( ||) 加入,那么您将获得第一个匹配的标记,而不是最长的标记:

say 'bartoo' ~~ / <{'bar || bartoo || baragain'}> /; # 「bar」
say 'bartoo' ~~ / ||@list /;                         # 「bar」
say 'bartoo' ~~ / ||<{<bar bartoo baragain>}> /;     # 「bar」

为这些构造指定管道符号与指定单个管道符号 ( |) 相同,并且匹配最长的匹配标记:

say 'bartoo' ~~ / <{'bar | bartoo | baragain'}> /; # 「bartoo」
say 'bartoo' ~~ / |@list /;                        # 「bartoo」
say 'bartoo' ~~ / |<{<bar bartoo baragain>}> /;    # 「bartoo」

你以前问过相关问题。为方便起见,我将在此处添加几个链接:

于 2019-01-01T00:52:54.607 回答