正则表达式:在单词中匹配4位数

时间:2013-08-24 20:48:29

标签: regex perl

我有一个文本正在寻找从中提取重复的4位数字。

例如:

  

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

现在我知道只需使用以下内容即可获得第一组数字:

    /\d{4}/

...返回1234

但是如何匹配第二组数字,或第三组数字,依此类推......?

编辑:如何返回2098或3213

5 个答案:

答案 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";