Perl regex用于过滤字符串中的数字

Perl regex用于过滤字符串中的数字,regex,perl,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位数字。您的模式\d{4}当前也进行部分匹配,这就是您无法获得预期输出的原因

我有一个字符串,如下所示。我正在尝试从字符串中仅过滤出4位数字

输出应为:1234 4567 3466

#!/usr/bin/perl  -w 

use strict ; 

my $str = "1234asdc345r4567srsrs45678rrrffgg3466";

my @arr =$str =~/(\d{4})/g;
问题是我得到的输出是:1234 4567 4567 3466。
我不希望输出中包含5位数字。

您的模式
\d{4}
当前也进行部分匹配,这就是您无法获得预期输出的原因。您可以使用lookarounds来判断您正在查找的4位数字之前或之后没有数字:

(?<!\d)(\d{4})(?!\d)
(?
  • Regex101演示:
  • 有关环顾四周的更多信息:

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

锚定你的模式,它就会起作用:

my $str = "1234asdc345r4567srsrs45678rrrffgg3466";

my @arr = $str =~/(?:^|\D)(\d{4})(?:\D|$)/g;
print join ( "\n", @arr );
捕获两边都有非数字(或行首/行尾)的4位数字

1234
4567
3466

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

顺便说一下,您应该在命令行或shebang行中使用警告'all'
,而不是
-w

像这样

#!/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 4567 3466
?谢谢,我更新了相同的,我会得到输出为1234 4567 5678 3466:(@SudhirMishra:我已经更新了答案,加入了一个演示。你能检查一下吗?Downvoter,你愿意解释一下,这样我就能改进答案吗?嗯,我认为正则表达式中有必要使用捕获括号,但这显然是行得通的。@Sobrique:在全局匹配的情况下不需要它们,因为它可以返回所有发生的pat完全匹配的情况tern,与仅捕获的部分相反,如果它小于完整模式。@辛巴基:对不起,应该是什么?@辛巴基:啊,我明白了。但是,列表上下文中的非全局模式匹配将返回捕获(如果有),但不会返回整个匹配字符串(如果没有)。您可以使用否定环视断言而不是所有我的@arr=$str=~/(?)?
1234 4567 3466