我有一个文本正在寻找从中提取重复的4位数字。
例如:
第一个是1234 2)第二个是2098 3)第三个是3213
现在我知道只需使用以下内容即可获得第一组数字:
/\d{4}/
...返回1234
但是如何匹配第二组数字,或第三组数字,依此类推......?
编辑:如何返回2098或3213
答案 0 :(得分: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
模式添加到正则表达式中,以便它只匹配整个四位数字,但不会在1234
中找到1234567
。 /x
修饰符只允许我添加空格,以便模式更易于理解。
答案 1 :(得分:1)
有关使用'g'修饰符的讨论,请参阅http://perldoc.perl.org/perlre.html,这将导致正则表达式匹配其模式的所有出现,而不仅仅是第一次出现。
答案 2 :(得分:1)
如果你想要一个找到$n
'4位数组的模式,这似乎有效:
$pat = "^(?:.*?\\b(\\d{4})\\b){$n}";
if ($s =~ /$pat/) {
print "Found $1\n";
} else {
print "Not found\n";
}
我是通过构建字符串模式来实现的,因为我无法将变量插入到量词{$n}
中。
此模式查找字边界上的4位数组(\b
测试);我不知道这是否符合您的要求。该模式使用.*?
来确保每个四位数组之间匹配尽可能少的字符。模式匹配$n
次,捕获组$1
设置为上次迭代时的任何值,即$n
'。
编辑:当我再次尝试时,它似乎在量词中插入$n
就好了。我不知道我做了什么不同,它上次没用。所以这可能会奏效:
if ($s =~ /^(?:.*?\b(\d{4}\b){$n}/) { ...
如果没有,请参阅amon关于qr//
的评论。
答案 3 :(得分:0)
如果正则表达式只匹配一次,那么将所有三个匹配在一个正则表达式中并使用匹配的组提取它们:
^.*\b(\d{4})\b.*\b(\d{4})\b.*\b(\d{4})\b.*$
将在第1组和第3组中捕获三个4位数字。
答案 4 :(得分:0)
Ajb回答&#34; gx&#34;是最好的。如果你知道你将有三个数字,这个直截了当的行就可以了:
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";