删除除正则表达式匹配的所有内容

时间:2015-09-01 09:31:21

标签: regex perl

我有一个字符串,我想替换除模式之外的所有内容。

现在我知道我想要做的是

$line =~ s/[A-Z]{4}[0-9]{4}//g;

但反转,以便除了模式之外什么都不用。

2 个答案:

答案 0 :(得分:2)

有点不清楚你在问什么,但你可能希望尝试类似下面的东西,它捕获模式然后用捕获替换该行:

#!/usr/bin/env perl

use warnings;
use strict;

my @lines = (
    'HELLO WORLD',
    'HELLO ABCD1234 WORLD',
    'HELLOABCD1234WORLD',
    'H E L LO ABCD1234 WORLD',
);

my $re_match = qr([A-Z]{4}[0-9]{4});

for my $line (@lines) {
    print "$line  => ";
    if ($line =~ $re_match) {
        $line =~ s|^.*($re_match).*$|$1|;
        print $line . "\n";
    } else {
        print "does not match pattern $re_match \n";
    }
}

<强>输出

HELLO WORLD  => does not match pattern (?^:[A-Z]{4}[0-9]{4})
HELLO ABCD1234 WORLD  => ABCD1234
HELLOABCD1234WORLD  => ABCD1234
H E L LO ABCD1234 WORLD  => ABCD1234

答案 1 :(得分:0)

perl -E '$_="xxABCD1234xxABCD1234xx"; @m = $_ =~ /[A-Z]{4}[0-9]{4}/g; @m and $_ = join "", @m; say'

输出:

ABCD1234ABCD1234