Perl中的正则表达式数字范围失败

时间:2014-06-24 17:42:23

标签: regex linux perl

我的脚本需要使用正则表达式查找特定的Linux内核版本 - 3.13.0-24-generic。

我试过了:

'((2\.[46])|(3\.[0-99])\.\d[^\/]*?) \(.*@.*\) [#]\d+.*'

但它不起作用。我怎样才能匹配我的内核版本?为什么上面的正则表达式无法匹配3.13.0-24-generic?

基于评论的附加信息:
我正在编辑SystemImager UseYourOwnKernel.pm脚本。原始脚本检查2.4或2.6内核:

my $regex =
#           | kernel version + build machine
#           `---------------------------------------
            '(2\.[46]\.\d[^\/]*?) \(.*@.*\) [#]\d+.*' .

3.0,1,2,(即单个数字3.X内核)适用于:

'((2\.[46])|(3\.[012])\.\d[^\/]*?) \(.*@.*\) [#]\d+.*'

我可以使用以下命令来匹配3.13和(3.0,3.1,3.2等)内核:

'((2\.[46])|(3\.[012]|3\.13)\.\d[^\/]*?) \(.*@.*\) [#]\d+.*' .

我需要一个匹配3.0到3.99的数值范围(这应该照顾所有3.X版本)。

2 个答案:

答案 0 :(得分:1)

你的正则表达式是,

(?:[0-9]|[1-9][0-9])\.(?:[0-9]|[1-9][0-9])\.(?:[0-9]|[1-9][0-9])-(?:[0-9]|[1-9][0-9])-\w+

DEMO

<强>解释

  • (?:[0-9]|[1-9][0-9])匹配0-99之间的任何数字。

  • \.一个文字点。

  • -文字-

更短的一个,

(?:(?:[0-9]|[1-9][0-9])\.){2}(?:(?:[0-9]|[1-9][0-9])-){2}\w+

DEMO

答案 1 :(得分:0)

此代码可能对您有所帮助:

(?:(?:[\d]|[1-9][\d])\.){2}(?:(?:[0-9]|[1-9][0-9])-){2}\w+