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

perl6 regex匹配连接&&

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

    如果连词中的所有部分都匹配相同的子字符串而不是整个字符串,则perl6 regex match concentration返回true:

    > my $a="123abc456def";
    123abc456def
    > so $a ~~ m/ 23 && ef /
    False
    

    这是错误的,因为连词中的“23”与$A中的“23”子字符串匹配,但该子字符串与连词中的“ef”不匹配。这有点违反直觉,因为将$A~~M/23&&ef/解释为“$A匹配23和$A匹配ef”比“$A具有匹配23的子字符串,并且此子字符串也匹配ef”更容易。

    如果我有n个正则表达式,我想看看这些n个正则表达式是否匹配整个字符串,而不是匹配整个字符串的相同子字符串部分,那么编写perl6表达式的最佳方法是什么?

    在这个例子中,我真的打算这样做

    so (($a ~~ /23/) && ($a ~~ /ef/))
    

    如果regex的数目很大,那么除了使用循环外,上面的代码很难写入:

    so (gather {for @myRegexes { take $a ~~ / $_ /; } }).all
    

    有更简单的方法吗?

    有了交替,就更容易理解为“$A匹配23或$A匹配ef”,而不是“$A匹配23或匹配ef的部分”:

    > so $a ~~ m/ 23 || ef /
    True
    

    谢谢!

    Lisprog公司

    4 回复  |  直到 6 年前
        1
  •  7
  •   raiph    6 年前

    foo op bar and foo op baz op foo op bar & baz

    & Junction

    ~~

    my $a="123abc456def";
    say so $a ~~ / 23 / & / ef /
    

    bar & baz & ...

    my @keywords = <12 de>;
    say so all ( $a.match: / $_ / for @keywords ) ;
    

    the .contains method

    say so all ( $a.contains: $_ for <23 ef> ) ;
    

    $a~~m/23&&ef/

    ioho

    say so $a ~~ / 23 / & / ef /
    

    &&

    &&

        2
  •  10
  •   Jonathan Worthington    6 年前

    Junction $a

    my $a = 'abcdef12345'; say so $a ~~ /23/ & /ef/   # True
    my $a = 'abcde12345'; say so $a ~~ /23/ & /ef/    # False 
    my $a = 'abcdef1245'; say so $a ~~ /23/ & /ef/    # False
    

    .all

    contains

    my $a = 'abcdef12345'; say so $a.contains(all('23', 'ef'))   # True
    my $a = 'abcde12345'; say so $a.contains(all('23', 'ef'))    # False
    my $a = 'abcdef1245'; say so $a.contains(all('23', 'ef'))    # False
    
        3
  •  2
  •   Håkon Hægland    6 年前

    $a

    my $a="123abc456def23";
    my %pats = <23 ef>.map({ $_ => 1 });
    my $join = %pats.keys.join('|');
    my $rx = rx{ <{$join}> };
    for $a ~~ m:g/ $rx / -> $match {
        %pats{$match.Str}:delete;
        if %pats.keys.elems == 0 {
            say "Match!";
            last;
        }
    }
    

        4
  •  1
  •   moritz    6 年前

    / ^ [ $re1 && $re2 && $re3 ] $ /
    

    / [^ .* $ ] && $re1 && $re2 /
    

    / .* $re1 .* && .* $re2 .* && .* $re2 .* /
    

    / ^ [ .* $re1 .* && .* $re2 .* && .* $re2 .* ] $ /