我希望匹配大于1.2.3的所有版本,所以
foo 1\.([0-1]\.|2\.[0-3])
,显然不起作用。
答案 0 :(得分:1)
嗯,有三个部分:
大于1:
[2-9]
大于1.2:
1\.[3-9]
大于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})
答案 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运算符。