7

我有一段文本,我希望从中提取重复的 4 位数字集。

例如:

第一个是 1234 2) 第二个是 2098 3) 第三个是 3213

现在我知道我可以通过简单地使用来获得第一组数字:

    /\d{4}/

...返回 1234

但是我如何匹配第二组数字,或者第三组,等等......?

编辑:我如何返回 2098 或 3213

4

5 回答 5

11

您似乎还没有正确回答您的问题。

解决方案是在您的正则表达式上使用/g修饰符。在列表上下文中,它会一次找到字符串中的所有数字,就像这样

my $str = 'The first is 1234 2) The Second is 2098 3) The Third is 3213';

my @numbers = $str =~ /\b \d{4} \b/gx;

print "@numbers\n";

输出

1234 2098 3213

或者你可以遍历它们,在while循环中使用标量上下文,就像这样

while ($str =~ /\b (\d{4}) \b/gx) {
  my $number = $1;
  print $number, "\n";
}

输出

1234
2098
3213

我已将\b模式添加到正则表达式中,以便它仅匹配整个四位数字,而不是,例如,12341234567. 修饰符只允许我添加空格,/x以便模式更易于理解。

于 2013-08-24T23:12:20.970 回答
1

请参阅http://perldoc.perl.org/perlre.html以了解有关使用“g”修饰符的讨论,这将导致您的正则表达式匹配其模式的所有出现,而不仅仅是第一个。

于 2013-08-24T21:00:24.870 回答
1

如果您想要一个找到$n第 4 位组的模式,这似乎可行:

$pat = "^(?:.*?\\b(\\d{4})\\b){$n}";
if ($s =~ /$pat/) {
   print "Found $1\n";
} else {
   print "Not found\n";
}

我通过构建字符串模式来做到这一点,因为我无法将变量内插到 quantifier{$n}中。

此模式查找位于单词边界上的 4 位组(\b测试);不知道是否符合你的要求。该模式用于.*?确保在每个四位数组之间匹配尽可能少的字符。模式是匹配$n时间,捕获组$1设置为上一次迭代中的任何值,即第$n'th 个。

编辑:当我再次尝试时,它似乎可以$n很好地插入量词。我不知道我做了什么不同的事情,上次没有奏效。所以也许这会起作用:

if ($s =~ /^(?:.*?\b(\d{4}\b){$n}/) { ...

如果没有,请参阅 amon 关于qr//.

于 2013-08-24T21:34:37.180 回答
0

如果正则表达式只匹配一次,则在一个正则表达式中匹配所有三个并使用匹配组提取它们:

^.*\b(\d{4})\b.*\b(\d{4})\b.*\b(\d{4})\b.*$

这三个 4 位数字将被捕获在组 1、2 和 3 中。

于 2013-08-24T21:33:11.890 回答
0

Ajb 对“gx”的回答是最好的。如果您知道您将拥有三个数字,那么这条直截了当的行就可以了:

my $str = 'The first is 1234 2) The Second is 2098 3) The Third is 3213';
my ($num1, $num2, $num3) = $str =~ /\b \d{4} \b/gx;
print "$num1, $num2, $num3\n";
于 2014-06-25T18:16:57.697 回答