需要 Perl 正则表达式匹配从 3.10.1.0 开始的每个软件版本以及所有后续版本编号

Need Perl regex which matches every a software version starting from 3.10.1.0 and all further versions numbering

这是我的测试用例。

A cmd_1,在版本 3.10.0.0 之前一直有效,在以后的版本中将无效。 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;
} 

上述正则表达式在少数情况下会失败。比如在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

我尝试了更多的正则表达式,但没能找到一个完美的正则表达式。请帮我解决这个问题。

提前致谢。

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

^(?:[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+$

它会查找 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

Demo on regex101

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

use version qw( );

if ($version >= version->declare("3.10.1.0")) {
   ...
} else {
   ...
}