如何匹配包含X和Y之间数字的行?

时间:2016-07-14 21:07:42

标签: regex perl

在大文件中,我有SIgnal_Catch[0]形式的行,其中大括号中的数字范围为0到223345.我想提取数字介于2239和13569之间的行。

我试过了:

print "$line" if $line =~ /SIgnal_Catch\[2239-13569]/;

但它与我想要的线不匹配。我也试过这个:

print "$line" if $line =~ /SIgnal_Catch\[\d+]/;

但它太匹配了。我怎样才能做到这一点? 对于这个特定的问题,我不能使用$ 1作为范围。

4 个答案:

答案 0 :(得分:2)

不要试图让正则表达式模式做得太多。您正在编写Perl程序,因此请使用Perl

这将按照您的要求进行

if ( /SIgnal_Catch\[(\d+)\]/ and $1 >= 2239 and $1 <= 13569 ) {
    ...
}

答案 1 :(得分:1)

由于您已经说过无法使用$1$&,因此这是我制作的正则表达式字符串。它有效,但它并不漂亮:

$line =~ /SIgnal_Catch\[\b(2239|22[456789]\d|2[3-9]\d{2}|[3-9]\d{3}|(10|11|12)\d{3}|13[0-4]\d{2}|135[0-6]\d)\b\]/;

就像我在评论中所说,你基本上必须考虑如何用字符串表示数字,并格式化所有替代方案。我在regex101上测试了这个字符串并且它有效。但是,如果将来再次出现这种正则表达式的可能性很小,那么值得考虑的是你是否可以修改工具(cfr Borodon的回复,或者我对原始问题的评论),而不仅仅是添加更多像这样的正则表达式。

注意:如果您在regex101网站上进行测试,并且在“测试字符串”框中有多个数字,请不要忘记将全局修饰符g添加到正则表达式,否则只会找到第一个。

答案 2 :(得分:0)

if ( $line =~ /.*SIgnal_Catch\[([1-9][0-9]{3,4})\].*/ ) {

    if ( $1 >= 2239  &&  $1 <= 13569 ) {
       print $line . "\n";
    }

}

正则表达式做你想做的事,嗯,真的很毛茸茸。尝试类似上面的内容。

答案 3 :(得分:-1)

正如AntonH所提到的,您可以使用以下内容:

shouldComponentUpdate

上面的正则表达式无效,您的匹配缺少&#34; [&#34;和&#34;]&#34;。

希望这有帮助。