我正在努力检查Perl中版本号的有效性.正确的版本号是这样的:
即有效版本号可能类似于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.] + /但是在我的尝试中我无法看到我允许它的位置.
你的问题是|- 或 - 你正在使用的是将整个模式分成两部分.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)