使用Perl正则表达式搜索并替换一定长度的字符串

时间:2012-10-04 13:25:37

标签: regex perl replace

我正在尝试搜索并替换长度不超过3个字符的字符串(所以'删除'元素内容)。

所以我有类似的东西:

foreach (@array) {
   s/^{1,3}$//;
}

E.g。

@array = ('one', 'two', 'three', 'four', 'five', 'six', 'seven');

因此,在打印时,预期输出将为:

result:  result:  result: three  result: four  result: five  result:  result: seven

因此,对于受影响的输入,输出将是一个“空位”。

目前这还没有发生......我打赌我犯了一个简单的错误,因为我对正则表达式的理解仍然不稳定。任何帮助赞赏!

如果有一种简单的方法可以在不创建新数组的情况下完全删除元素,那么知道这一点也很有用。

4 个答案:

答案 0 :(得分:5)

如果您想匹配任意三个字符,s/^.{1,3}$//应该有效。我刚刚在^之后添加了一个点,因为你的原始正则表达式没有指定你想要匹配的1-3个字符。

答案 1 :(得分:4)

可能s/^\w{1,3}$//;

您忘记\w将其与{1,3}

分组

答案 2 :(得分:4)

除了简单的正则表达式问题,您可以使用grep选择所需的元素:

@array = grep { !/^.{1,3}$/ } @array;

然后只打印结果:

print "Result: $_\n" foreach @array;

结果:

Result: three
Result: four
Result: five
Result: seven

答案 3 :(得分:0)

我阅读你的问题的方式是你想要实际修改数组的内容。你可以这样使用splice

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Dumper;
my @array = qw(one two three four five six seven);
my $i = 0;
for (@array) {
    m/^\w{1,3}$/ && splice(@array, $i, 1, undef);
    $i++;
}
print Dumper \@array;
print "\n";
for my $e (@array) {
    print defined $e ? "result: $e  " : "result:  "
}
print "\n";

跑步时:

$VAR1 = [
          undef,
          undef,
          'three',
          'four',
          'five',
          undef,
          'seven'
        ];

result:  result:  result: three  result: four  result: five  result:  result: seven