Perl regex用于过滤字符串中的数字
我有一个字符串,如下所示。我正在尝试从字符串中仅过滤出4位数字 输出应为:1234 4567 3466Perl 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}当前也进行部分匹配,这就是您无法获得预期输出的原因
#!/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