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

带圆括号的匹配作为数组(Perl)

  •  3
  • JoelFan  · 技术社区  · 14 年前

    我似乎记得有一种方法可以访问Perl中正则表达式的括号匹配(即。 $1 , $2 , $3 作为一个数组,但现在我似乎找不到。也不是 @+ @- 是我的意思。

    编辑: 我应该加上我想在 s/// (替代),如下:

    s/(foo)(bar)+(baz)/mySubst(@!)/e;
    

    (如果 @! 是我要找的阵列)

    4 回复  |  直到 14 年前
        1
  •  5
  •   Eric Strom    14 年前

    我不知道有一个内置的魔术数组可以容纳所有带括号的组,但这并不能阻止您创建一个:

    {package Match::Parens;
        sub TIEARRAY {bless []}
        sub FETCH {no strict 'refs'; ${$_[1] + 1}}
        sub FETCHSIZE {$#+}
        tie @!, __PACKAGE__;
    }
    
    sub mySubst {join ', ' => map ucfirst, @_}
    
    my $str = 'foobarbarbaz';
    
    $str =~ s/(foo)(bar)+(baz)/mySubst(@!)/e;
    
    say $str;  # prints 'Foo, Bar, Baz'
    

    我们在此声明 Match::Parens 将是新实施的 @! 打领带。每次访问时,它都会在该索引处查找当前的匹配paren。当前实现从0开始,类似于数组,您可能希望将其更改为从1开始,类似于 $1, $2, $3 瓦尔斯。

        2
  •  1
  •   Wooble    14 年前

    @数组=$foo=~m/(your)(reg)(exp)/;

        3
  •  1
  •   RC.    14 年前

    您是否在考虑它在全局匹配标志下的行为?

    @matches = /x(.+?)y/g;   # Matching against $_
    

    Matches将为字符串中的每个匹配项包含一个数组元素。

    我也没听说过你在说什么。 This link 可能会给你提供一些信息来帮助你实现你想要做的。

        4
  •  0
  •   aartist    14 年前

    这是一份工作。您也可以作为参考访问它们。

    s/(foo)(bar)+(baz)/mySubst([$1,$2,$3,$4])/e; 
    

    如果您知道匹配元素的上界,这将非常有用。这个解决方案不会因警告而中断。