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

时间:2010-11-23 14:52:54

标签: regex perl

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

修改 我应该补充一点,我想在s///(替换)中访问这个数组,如下所示:

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

(如果@!是我正在寻找的数组)

4 个答案:

答案 0 :(得分:5)

我不知道有一个内置的魔术数组,它包含所有带括号的组,但这不会阻止你制作一个:

{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将是带有tie的@!数组的新实现。每次访问它时,它都会在该索引处查找当前匹配项。当前的实现从0开始,就像数组一样,您可能希望将其更改为从$1, $2, $3变量开始为1。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您是否正在考虑使用全局匹配标志的行为?

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

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

我从未听说过你所指的是什么。 This link可能会为您提供一些信息,帮助您实现您的目标。

答案 3 :(得分:0)

这是一个解决方法。您也可以访问它们作为参考。

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

如果您知道匹配元素的上限,这将很有效。这个解决方案不会出现警告。