如何让 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 }
我正在尝试匹配组中的任何关键字。关键字在数组@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 }