日期:2014-05-16  浏览次数:20718 次

正则表达式匹配数字范围?
linux的正则表达式匹配数字,是[0-9]。可是我现在需要匹配一个范围,比如1-5、1-18等等,这个是不确定的,最大的那个数是根据ls的结果文件个数确定的。
最小的数确定是1.
最大的数length=${#array[@]},是一个数组的长度。。。

大家来帮忙!

------解决方案--------------------
既然这个最大数字是不确定的,也就是只能是个变量。 这个就比较复杂了。我建议你利用正则表达式提取该值,进行判断是否满足要求。


------解决方案--------------------
如果你实在想用正则表达式,你就这样吧:

比如要求 1-276,而且不能匹配高位补0的,比如027、01;不能匹配0;不能匹配大于276的。
那么正则可以是:
reg = "\\b[1-2](?<!2[8-9])[0-7](?<!27[7-9])[0-6]\\b|\\b[1-9][0-9]\\b|\\b[1-9]\\b";
解释一下:
\\b用来表示字的开始和结束。
第一种就是100-276的;第二种就是10-99的;第三种就是1-9的。中间用“|"连接。
第一种的100-276写作"\\b[1-2](?<!2[8-9])[0-7](?<!27[7-9])[0-6]\\b"即 如果是2为首位,则不能是第二位为7以上,如果27为前两位,则第三位不能为6以上。

而因为你的最大数来自变量,因此必须知道这个变量的每个字符对应的位的值。
例如: int max为你所知道的最大值,而且你知道它是3位数。

String max1 = max.substring(0,1);
String max2 = max.substring(1,2);
String max3 = max.substring(2,3);
然后正则表达式写作:
String reg = "\\b[1-" +a+ "+](?<!" +a+ "[" +(b+1)+ "-9])[0-" +b+ "](?<!"+a+b+"+["+(c+1)+"-9])[0-"+c+"]\\b" +"|\\b[1-9][0-9]\\b|\\b[1-9]\\b";
------解决方案--------------------
LZ可能误会正则表达式了,正则表达式只能做字符串匹配,对数值比较无能为力……
至于LZ说的[0-9]并不是正则表达式匹配数字0-9,而是在字符编码里,0-9这十个字符是连续编码的,所以可以这么写,这和a-z是一个道理,没有谁大谁小的概念……
在正则表达式看来,18不是一个数字,而是一个字符1和一个字符8,正则表达式不知道18和19哪个大,只知道都是两个字符,所以正则表达式对数值比较毫无办法……
如果LZ想进行数值比较,还是换其他方法吧,正则表达式只认识字符,不认识数字……
------解决方案--------------------
探讨

如果你实在想用正则表达式,你就这样吧:

比如要求 1-276,而且不能匹配高位补0的,比如027、01;不能匹配0;不能匹配大于276的。
那么正则可以是:
reg = "\\b[1-2](?<!2[8-9])[0-7](?<!27[7-9])[0-6]\\b|\\b[1-9][0-9]\\b|\\b[1-9]\\b";
解释一下:
\\b用来表示字的开始和结束。
第一种就是10……

------解决方案--------------------

那你匹配数字就可以了啊。
"[0-9]{1,}" 表示是1个以上的0-9的字符。

例如 0,01,05,078,0023,3333 都可以匹配上。如果输入的是这个匹配上的数字,那么你将这个变量与文件个数进行大小比较就可以了。