我的字符串如下所示。我正在尝试过滤掉字符串中的4位数字。
输出应为:1234 4567 3466
#!/usr/bin/perl -w
use strict ;
my $str = "1234asdc345r4567srsrs45678rrrffgg3466";
my @arr =$str =~/(\d{4})/g;
问题是我得到的输出为:1234 4567 4567 3466。 我不希望5位数字包含在输出中。
答案 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