我想匹配所有大于 1.2.3 的版本,所以
foo 1\.([0-1]\.|2\.[0-3])
,显然不会工作。
问问题
126 次
5 回答
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})
于 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+) 之类的正则表达式提取单个数字a、b和c并使用 ( 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 回答