Perl正则表达式过滤字符串

时间:2015-10-30 17:26:14

标签: regex perl

我的字符串如下所示。我正在尝试过滤掉字符串中的4位数字。

输出应为:1234 4567 3466

#!/usr/bin/perl  -w 

use strict ; 

my $str = "1234asdc345r4567srsrs45678rrrffgg3466";

my @arr =$str =~/(\d{4})/g;

问题是我得到的输出为:1234 4567 4567 3466。 我不希望5位数字包含在输出中。

3 个答案:

答案 0 :(得分:5)

您的模式\d{4}目前也会进行部分匹配,这就是您无法获得预期输出的原因。您可以使用外观来表明您正在寻找数字之前或之后的4位数字:

(?<!\d)(\d{4})(?!\d)

答案 1 :(得分:4)

我认为最干净的方法是查找十进制数字的所有子序列,然后丢弃那些长度不超过四个字符的

顺便说一句,你应该use warnings 'all'优先于-w命令行或shebang行

喜欢这个

#!/usr/bin/perl

use strict;
use warnings 'all';
use v5.10;

my $str = '1234asdc345r4567srsrs45678rrrffgg3466';

my @arr = grep { length == 4  } $str =~ /\d+/g;

say "@arr";

输出

1234 4567 3466

答案 2 :(得分:3)

\d{4}是5位序列的子串,这就是它匹配的原因。

锚定您的模式,它将起作用:

my $str = "1234asdc345r4567srsrs45678rrrffgg3466";

my @arr = $str =~/(?:^|\D)(\d{4})(?:\D|$)/g;
print join ( "\n", @arr );

在两侧捕获4位数字,其中包含非数字(或行的开头/结尾)。

1234
4567
3466