需要Perl正则表达式,它与从3.10.1.0开始的每个软件版本以及所有其他版本编号都匹配

Sub*_*ash 6 regex perl version

这是我的测试用例。

在版本3.10.0.0之前可以使用的cmd_1在以后的版本中将不起作用。Cmd_2在3.10.1.0中引入,将是以后的有效替换。

我需要为上述情况添加一个条件。对于3.10.1.0之前的旧版本,必须执行cmd_1,而对于3.10.1.0及更高版本,则必须执行cmd_2。

我尝试如下:

if ( ( $version =~ /^3\.10\.[1-9]/ ) || ( $version =~ /^3\.[1-9][0-9]/ ) || ( $version =~ /^[4-9]/ ) {
    # execute cmd_2;
}else{
    # execute cmd_1;
} 
Run Code Online (Sandbox Code Playgroud)

上述正则表达式在某些情况下会失败。例如,在version = 3.10.0.0的情况下,将执行cmd_2,这是无效的。

Cmd_2必须在以下版本中执行:

3.10.1.03.10.2.03.11.0.03.11.2.03.20.0.04.0.0.05.0.0.010.0.0.0

Cmd_1必须在以下版本中执行:

3.10.0.03.9.0.03.1.0.03.0.0.02.0.0.01.0.0.0

我尝试了一些正则表达式,但找不到理想的正则表达式。请帮我解决一下这个。

提前致谢。

ike*_*ami 11

不要为此使用正则表达式模式。

use version qw( );

if ($version >= version->declare("3.10.1.0")) {
   ...
} else {
   ...
}
Run Code Online (Sandbox Code Playgroud)


Nic*_*ick 5

这个正则表达式应该做你想要的。

^(?:[4-9]|[1-9]\d+)(?:\.\d+){3}|3\.[2-9]\d(?:\.\d+){2}|3\.1[1-9](?:\.\d+){2}|3\.10\.[1-9]\d?\.\d+$
Run Code Online (Sandbox Code Playgroud)

它寻找所有cmd_2应该运行的情况,即

[1-9]x.x.x.x
[4-9].x.x.x
3.[2-9]x.x.x
3.1[1-9].x.x
3.10.[1-9]x.x
3.10.[1-9].x
Run Code Online (Sandbox Code Playgroud)

regex101上的演示