如何让 subrule/regex 在比赛中使用时不区分大小写?

How to make subrule/regex case-insensitive when used in match?

我正在尝试匹配组中的任何关键字。关键字在数组@b 中。我无法进行不区分大小写的匹配。我做了一些测试,下面的脚本就是一个例子:

> my $line = "this is a test line";
this is a test line

> my @b = < tes lin > ; 
[tes lin]

> my regex a { || @b };
regex a { || @b }

> say $line ~~ m:i/ <a> /    # matching the first as expected
「tes」
 a => 「tes」

> say $line ~~ m:i:g/ <a> /  # matching both as expected
(「tes」
 a => 「tes」 「lin」
 a => 「lin」)

> my @b = < tes LIN > ; 
[tes LIN]
> my regex a { || @b };
regex a { || @b }
> say $line ~~ m:i:g/ <a> /   # should match both "tes" and "LIN" but skips "LIN"
(「tes」
 a => 「tes」)

> my @b = < TES lin >
[TES lin]
> my regex a { || @b }
regex a { || @b }
> say $line ~~ m:i:g/ <a> /   # expect to match both but skips "TES"
(「lin」
 a => 「lin」)

此外,映射到所有小写字母不起作用:

> my @b = < TES lin >.lc
[tes lin]
> my regex a { || @b }
regex a { || @b }
> say $line ~~ m:i:g/ <a> /
()

我的问题是,实际调用regex/subrule时应该如何处理不区分大小写?

我试图将 :i 副词放在正则表达式 a 中,但结果匹配无效:

> my regex a { :i || @b }
regex a { :i || @b }
> say $line ~~ m:i:g/ <a> /
(「」
 a => 「」 「」

然后是19行的“a => ・・・・”

 a => 「」)

问题:

my regex a { || @b }
say $line ~~ m:i/ <a> /

是不是a是负责匹配@b中值的正则表达式,不是用:i编译的。
在 Perl6 中,正则表达式是代码,您不能像那样从远处更改正则表达式的工作方式。

然后还有一个问题:

my regex a { :i || @b }

真正编译为:

my regex a {
     [ :i    ]
  ||
     [    @b ]
}

匹配 ignorecase[nothing] 如果失败(不会失败)匹配 @b.

中的值之一

使用 || @… 的唯一原因是它按照定义的顺序匹配 @… 中的值。

> my @c = < abc abcd foo >;

> say 'abcd' ~~ / || @c /
「abc」

我认为在大多数情况下,让它成为默认的 | 语义实际上会更好。

> my @c = < abc abcd foo >;

> say 'abcd' ~~ / |  @c /
「abcd」
> say 'abcd' ~~ /    @c /
「abcd」

那么这将按照您希望的方式工作:

my regex a { :i @b }

<a>|<b> 将匹配具有最长起始表达式的那个。虽然 <a>||<b> 将首先尝试 <a>,如果失败,它将尝试 <b>.


如果你真的想要 || 语义,以下任何一个都可以:

my regex a {     ||  :i @b  }
my regex a { :i [||     @b] }

以下没有 || 语义。
事实上 || 没有做任何事情。

my regex a {     || [:i @b] }

与这些相同:

my regex a {     |   :i @b  }
my regex a {         :i @b  }