0

我想匹配所有大于 1.2.3 的版本,所以 foo 1\.([0-1]\.|2\.[0-3]),显然不会工作。

4

5 回答 5

1

嗯,分为三个部分:

  1. 大于 1:

    [2-9]
    
  2. 大于 1.2:

    1\.[3-9]
    
  3. 大于 1.2.3:

    1\.2\.[4-9]
    

将它们组合起来:

(?<=\s|^)([2-9]|1\.[3-9]|1\.2\.[4-9])

不过,这假设是个位数版本。对于多位数版本,您可以使用:

(?<=\s|^)([2-9]|1\d|1\.[3-9]|1\.\d{2}|1\.2\.[4-9]|1\.2\.\d{2})
于 2012-05-24T15:10:10.347 回答
0

怎么样

foo [1-9]*\.((([3-9]{1}[0-9]*\.[0-9]*)|([2]{1}[0-9]{1}\.[0-9]*))|([2-9]{1}[0-9]*\.([3-9]{1}[0-9}{1})|([4-9]{1}[0-9]*)))

不紧凑,但做的工作

你可以用这个来试试

于 2012-05-24T15:25:58.430 回答
0

我不会为此编写复杂的正则表达式,而是使用 (\d+)\.(\d+)\.(\d+) 之类的正则表达式提取单个数字abc并使用 ( a > 1之类的表达式) || ( b > 2) || ( c > 3) 进行比较,其中 || 是短路或运算符。

于 2012-05-24T15:31:12.190 回答
0

如果你想要大于 1.2.3 的值,那么你只需要检查每个数字是否前一个数字相等:

foo 1\.(2\.[4-9]|[3-9]\.\d)|[2-9]\.\d\.\d

如果我们假设多位数版本,那么您将不得不使用类似

foo 1\.(2\.([4-9]|\d{2,})|([3-9]|\d{2,})\.\d+)|([2-9]|\d{2,})\.\d+\.\d+
于 2012-05-24T15:13:30.793 回答
0

您正在尝试根据数字在语义上的含义生成匹配项。正则表达式只擅长验证语法,而不是语义。虽然您可以在技术上编写一个正则表达式来实现您的目标(Joey 会工作),但这更像是一种 hack,而不是一个好的设计。

尝试将版本字符串的片段解析为整数,然后进行数学比较。例如,在 C# 中:

public bool IsV1Bigger() {
    string v1 = "1.3.2";
    string v2 = "1.2.3";

    if(v1 == v2) return false;

    string[] v1Array = v1.Split('.');
    string[] v2Array = v2.Split('.');

    if(Convert.ToInt32(v1Array[0]) < Convert.ToInt32(v2Array[0])) return false;
    else if(Convert.ToInt32(v1Array[0]) > Convert.ToInt32(v2Array[0])) return true;

    if(Convert.ToInt32(v1Array[1]) < Convert.ToInt32(v2Array[1])) return false;
    else if(Convert.ToInt32(v1Array[1]) > Convert.ToInt32(v2Array[1])) return true;

    if(Convert.ToInt32(v1Array[2]) < Convert.ToInt32(v2Array[2])) return false;
    else if(Convert.ToInt32(v1Array[2]) > Convert.ToInt32(v2Array[2])) return true;
}
于 2012-05-24T15:18:58.187 回答