我有一段文本,我希望从中提取重复的 4 位数字集。
例如:
第一个是 1234 2) 第二个是 2098 3) 第三个是 3213
现在我知道我可以通过简单地使用来获得第一组数字:
/\d{4}/
...返回 1234
但是我如何匹配第二组数字,或者第三组,等等......?
编辑:我如何返回 2098 或 3213
您似乎还没有正确回答您的问题。
解决方案是在您的正则表达式上使用/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
模式添加到正则表达式中,以便它仅匹配整个四位数字,而不是,例如,1234
在1234567
. 修饰符只允许我添加空格,/x
以便模式更易于理解。
请参阅http://perldoc.perl.org/perlre.html以了解有关使用“g”修饰符的讨论,这将导致您的正则表达式匹配其模式的所有出现,而不仅仅是第一个。
如果您想要一个找到$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//
.
如果正则表达式只匹配一次,则在一个正则表达式中匹配所有三个并使用匹配组提取它们:
^.*\b(\d{4})\b.*\b(\d{4})\b.*\b(\d{4})\b.*$
这三个 4 位数字将被捕获在组 1、2 和 3 中。
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";