代码之家  ›  专栏  ›  技术社区  ›  lisprogtor

Perl6在match中使用时如何使subrule/regex不区分大小写?

  •  6
  • lisprogtor  · 技术社区  · 6 年前

    我正在尝试匹配组中的任何关键字。关键字在array@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/子规则时,如何处理大小写不敏感?

    我试着把:我副词放在regex a里面,但结果是无效的:

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

    然后是19行“a=>”

     a => 「」)
    

    非常感谢你!!!!

    利斯普格

    1 回复  |  直到 6 年前
        1
  •  6
  •   Brad Gilbert    6 年前

    问题在于:

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

    那是 a regex负责匹配 @b ,它不是用 :i .
    在Perl6中,regex是代码,您不能从这样的距离改变regex的工作方式。

    然后还有一个问题:

    my regex a { :i || @b }
    

    它实际上被编译为:

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

    那就是比赛 ignorecase[nothing] 如果失败(不会失败)匹配 @乙 .

    使用的唯一理由 || @… 使其与中的值匹配 @… 它们的定义顺序。

    > 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  }
    
    推荐文章