在文本中查找特定的数字组合

时间:2018-08-26 10:14:05

标签: regex perl

当在开始措辞和结束措辞之间可见字符串中的特定数字时,我只希望匹配3位数字(在600以下,例如在“ 598”以下)。使用下面的正则表达式,我得到了所有内容的匹配,有人可以帮忙吗?

正则表达式:(?<=Start)(.*)(?=End)

测试字符串:

开始 440 3 956 4 603 5-6 603 7 440 8-9 440 10 956 11 44​​0 12 603 13 2005 14 440 15 598 16 1156 17 946 18 761 19 761 20 946 21 598 22598 23 1156 24 2057 25 946 26 1194 27 946 28946---苏黎世2019 MTWTFSS----1-2 1058 3 542 4 852 5-6 1517 7 1058 8-9 1058 10 848 11 542 12 705 13 1306 14 1058 15 1258 16 2159 17 1617 18 700 19 863 20 700 21 1258 22 1911 23 1911 24 1617 25 1258 26 2759 27 1258 28 1258---结束

4 个答案:

答案 0 :(得分:1)

使用\b[0-5]\d{2}\b,您可以找到600以下的所有3位数字。 演示:https://regex101.com/r/0ZSbbY/2

答案 1 :(得分:1)

尝试以下模式:

(?<=^|\D)[1-5]?\d{2}(?!.+Start)(?=\D.+End)

(?<=^|\D)[1-5]?\d{1,2}将匹配所有小于1或2的数字,因为它们小于600。它还会找到1 **,2 **,3 **,4 **,5 **数字。

(?!.+Start)(?=\D.+End)的前瞻性确保我们在之前 End字和不在 Start字之前,即它们之间。正如@TimBiegeleisen所说的那样,不能用积极的眼光看待它,因为它的长度是可变的。

Demo

答案 2 :(得分:1)

#!/usr/bin/perl
use Modern::Perl;
use Data::Dumper;

my $str = 'Start 440 3 956 4 603 5 - 6 603 7 440 8 - 9 440 10 956 11 440 12 603 13 2005 14 440 15 598 16 1156 17 946 18 761 19 761 20 946 21 598 22 598 23 1156 24 2057 25 946 26 1194 27 946 28 946 - - - Zurich 2019 M T W T F S S - - - - 1 - 2 1058 3 542 4 852 5 - 6 1517 7 1058 8 - 9 1058 10 848 11 542 12 705 13 1306 14 1058 15 1258 16 2159 17 1617 18 700 19 863 20 700 21 1258 22 1911 23 1911 24 1617 25 1258 26 2759 27 1258 28 1258 - - - End';

my $threshold = 600;
my $re = qr/
    (?:             # start non capture group
        Start       # literally
      |             # OR
        \G          # iterate from last match position
    )               # end group
    (?:(?!End).)*?  # make sure we don't have "End" before to number to find
    (?<!\d)         # negative lookbehind, make sure we don't have a digit before
    (\d{3})         # 3 digit number
    (?!\d)          # negative lookahead, make sure we don't have a digit after
/x;
# Retrieve all 3 digit numbers between Start and End
my @numbers = $str =~ /$re/g;
# Select numbers that are less than $threshold. In this case 600
@numbers = grep { $_  < $threshold } @numbers;

say Dumper \@numbers;

输出:

$VAR1 = [
          440,
          440,
          440,
          440,
          440,
          598,
          598,
          598,
          542,
          542
        ];

答案 3 :(得分:0)

如果您要搜索一个特定的数字,例如接近600的数字,我建议使用regexp来收集所有数字,然后使用一些算法来查找匹配的数字。

此正则表达式将帮助您检查字符串是否与模式匹配,并使用“数字”组收集所有数字。

^Start (([^\d]+ )*((?<number>\d+) )*)*End$ 

此简单的正则表达式将帮助您收集数字而无需检查所有字符串:

\d+

遍历您的数字收藏并找到所需的收藏。

抱歉,我没有注意到您使用哪种语言编写代码段。