正则表达式尝试匹配早于1.2.3的所有foo版本

时间:2012-05-24 15:06:29

标签: regex

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

5 个答案:

答案 0 :(得分:1)

嗯,有三个部分:

  1. 大于1:

    [2-9]
    
  2. 大于1.2:

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

    1\.2\.[4-9]
    
  4. 结合它们:

    (?<=\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})
    

答案 1 :(得分: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+

答案 2 :(得分:0)

您尝试根据语义的含义生成匹配。正则表达式仅擅长验证语法,而不是语义。虽然你可以在技术上写一个正则表达式来实现你的目标(Joey会起作用),但它将更像是一个黑客而不是一个好的设计。

尝试将版本字符串的片段解析为整数,然后以数学方式比较它们。例如,在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;
}

答案 3 :(得分: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]*)))

不紧凑,但做的工作

您可以使用this尝试

答案 4 :(得分:0)

我没有为此编写复杂的正则表达式,而是使用正则表达式(例如)提取单个数字 a b c 。 \ d +)\。(\ d +)\。(\ d +)并使用类似( a &gt; 1)||的表达式( b &gt; 2)|| ( c &gt; 3)进行比较,其中||是一个短路OR运算符。