perl6如何使子规则/正则表达式不区分大小写的匹配使用时?

问题描述 投票:6回答:1

我想在一组匹配的关键字。关键字是在阵列@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> /
()

我的问题是,如何不区分大小写处理时,正则表达式/子规则实际上是叫什么名字?

我试图把我副词一个正则表达式,但里面所产生的匹配是徒劳的:

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

然后19线“A =>「」「」”

 a => 「」)

非常感谢你 !!!

lisprog

regex match perl6 case-insensitive
1个回答
6
投票

这个问题有:

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  }
© www.soinside.com 2019 - 2024. All rights reserved.