从s / pattern / sub / g获取替换

时间:2014-04-05 05:44:17

标签: regex perl substitution

我试图从替换函数中获取被替换(实际上已删除)的内容。

例如:

my $line = q{hello "my" friend "how" are 'you'};
$line =~ s/("[^"]*"|'[^']*')//g; # Removing any balanced quotes

# I'd like to print
# "my" "how" 'you'

请善待,我从Perl开始: - )。

3 个答案:

答案 0 :(得分:5)

您可以使用/e正则表达式修饰符来执行替换部分中的代码,其中$1被推入@w数组,最后被""空字符串替换。< / p>

my @w;
$line =~ s/("[^"]*"|'[^']*')/ push @w,$1; "" /ge;

print "$_\n" for @w;

答案 1 :(得分:5)

您可以使用循环并处理每个替换,而不是使用global替换:

my $line = qq(hello "my" friend "how" are 'you');
print "$1\n" while $line =~ s/("[^"]*"|'[^']*')//;
print "$line\n";

给出:

"my"
"how"
'you'
hello  friend  are 

答案 2 :(得分:0)

这是另一种方式,使用内置的@-@+数组来保存最新成功匹配和捕获的偏移量。

它只是找到所有匹配的子字符串,将它们保存在@removed中并使用substr删除它们。

use strict;
use warnings;

my $line = q{hello "my" friend "how" are 'you'};

my @removed;

while ($line =~ /("[^"]*"|'[^']*')/g) {
  push @removed, $1;
  substr $line, $-[0], $+[0] - $-[0], '';
}

print $line, "\n";
print "@removed\n";

<强>输出

hello  friend  are 
"my" "how" 'you'