使用Perl检查版本号有效性

Mak*_*kis 1 regex perl

我正在努力检查Perl中版本号的有效性.正确的版本号是这样的:

  • 从v或ver开始,
  • 在那之后是一个数字,如果它是0,那么这部分中不允许其他数字(例如10,3993和0都可以,01不是),
  • 之后是一个完整的停止,一个数字,一个完整的停止,数字,句号和数字.

即有效版本号可能类似于v0.123.45.678或ver18.493.039.1.

我提出了以下正则表达式:

if ($ver_string !~ m/^v(er)?(0{1}\.)|([1-9]+\d*\.)\d+\.\d+\.\d+/) 
{
   #print error
}
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为版本号如verer01.34.56.78被接受.我无法理解这一点,我知道Perl往往是贪心,但不应该^ v(呃)?确保最多只能有一个"呃"?为什么不是0 {1}.仅匹配"0",而不是接受"01".还有?

这个正则表达式实际上抓住了"rere"的东西:m/^ v(呃)?[0-9.] + /但是在我的尝试中我无法看到我允许它的位置.

Dav*_*ebb 7

你的问题是|- 或 - 你正在使用的是将整个模式分成两部分.A |将范围限制为括号或表达式的结尾,而不仅仅是两个相邻项.

你需要放一些额外的括号,两个显示你想要的表达式的哪个部分.因此,修复模式的第一步是:

^v(er)?((0{1}\.)|([1-9]+\d*\.))\d+\.\d+\.\d+
Run Code Online (Sandbox Code Playgroud)

您还希望$在结尾处放置一个以确保版本号末尾没有虚假字符.

此外,放置{1}是不必要的是它意味着前一个项目恰好是默认值的一次.但是,您可以{3}在模式的末尾使用,因为您最后需要三个点数组.

同样地,你不需要+之后,[1-9]因为其他数字将被抓住\d*.

我们也可以删除unnessary括号.

所以你可以将你的模式简化为以下内容:

^v(er)?(0|[1-9]\d*)(.\d+){3}$
Run Code Online (Sandbox Code Playgroud)