正则表达式匹配数字范围?

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

大家来帮忙!
...全文
13512 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
IterZebra 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hardwin 的回复:]

试了下,还是不够完善。如果字符是数字开头,后面跟的是别的字符,这个正则也能通过。
还是把多分给你的,斑马童鞋。☺

同事帮我找到了比较完善的写法。丢出来跟大家分享。O(∩_∩)O~

这是写在我脚本里的,接收的参数就是咱们要验证的字符。
验证不通过返回1,否则返回0

number_match(){
if [[ $# = 0 ]];then
echo "Need ……
[/Quote]

额,加个结束符号就可以了。
Lena-Yang 2011-09-27
  • 打赏
  • 举报
回复
试了下,还是不够完善。如果字符是数字开头,后面跟的是别的字符,这个正则也能通过。
还是把多分给你的,斑马童鞋。☺

同事帮我找到了比较完善的写法。丢出来跟大家分享。O(∩_∩)O~

这是写在我脚本里的,接收的参数就是咱们要验证的字符。
验证不通过返回1,否则返回0

number_match(){
if [[ $# = 0 ]];then
echo "Need a parameter"
return 1
else
if [[ ! $1 =~ ^[0-9]+$ ]]
then
return 1
fi
return 0
fi
}
IterZebra 2011-09-26
  • 打赏
  • 举报
回复

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

例如 0,01,05,078,0023,3333 都可以匹配上。如果输入的是这个匹配上的数字,那么你将这个变量与文件个数进行大小比较就可以了。
IterZebra 2011-09-26
  • 打赏
  • 举报
回复
搞半天你是想写个shell脚本,从标准输入输出终端读入一个数字啊。

Lena-Yang 2011-09-26
  • 打赏
  • 举报
回复
真实脚本是这样子:

[1] nbi_db
[2] mysql
[3] fwk
[4] test

Please input the number before database name.Otherwise,exit.Input:

假设文件个数为len

上面是通过ls找到的文件列表,前面是给的数字编号。接下来是提示用户input文件前面的数字来进行选择,
我需要判断用户输入的是数字,然后判断该数字>=1 && <=$len

因不知道匹配数字该怎么写,现在是曲线救国方式实现的。
Lena-Yang 2011-09-26
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mesh4444 的回复:]
LZ可能误会正则表达式了,正则表达式只能做字符串匹配,对数值比较无能为力……
至于LZ说的[0-9]并不是正则表达式匹配数字0-9,而是在字符编码里,0-9这十个字符是连续编码的,所以可以这么写,这和a-z是一个道理,没有谁大谁小的概念……
在正则表达式看来,18不是一个数字,而是一个字符1和一个字符8,正则表达式不知道18和19哪个大,只知道都是两个字符,所以正则表达式对数值比较毫无办法…………
[/Quote]

其实,我的这个需求,只用判断那个字符是数字就行了。而数字的范围,用条件语句去判断。
可是,linux里面只有[0-9],大于一位的数字就没法匹配了。JAVA里面是有对于数字的匹配规则。linux里面怎么匹配数字呢??
IterZebra 2011-09-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 iterzebra 的回复:]

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

比如要求 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……
[/Quote]

注意,这里的a应该改成max1,b改成max2,c改成max3。

写的时候没注意。

IterZebra 2011-09-26
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 hardwin 的回复:]

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

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


这个靠谱。"[0-9]{1,}" 要写成这样"[0-9]\{1,\}"
好了☺
[/Quote]

好了就结贴给分哈~
Lena-Yang 2011-09-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 iterzebra 的回复:]
那你匹配数字就可以了啊。
"[0-9]{1,}" 表示是1个以上的0-9的字符。

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

这个靠谱。"[0-9]{1,}" 要写成这样"[0-9]\{1,\}"
好了☺
子谋 2011-09-25
  • 打赏
  • 举报
回复
LZ可能误会正则表达式了,正则表达式只能做字符串匹配,对数值比较无能为力……
至于LZ说的[0-9]并不是正则表达式匹配数字0-9,而是在字符编码里,0-9这十个字符是连续编码的,所以可以这么写,这和a-z是一个道理,没有谁大谁小的概念……
在正则表达式看来,18不是一个数字,而是一个字符1和一个字符8,正则表达式不知道18和19哪个大,只知道都是两个字符,所以正则表达式对数值比较毫无办法……
如果LZ想进行数值比较,还是换其他方法吧,正则表达式只认识字符,不认识数字……
IterZebra 2011-09-25
  • 打赏
  • 举报
回复
上述是Java代码,Linux的Shell实现,我就不帮你改了。
IterZebra 2011-09-25
  • 打赏
  • 举报
回复
如果你实在想用正则表达式,你就这样吧:

比如要求 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";
IterZebra 2011-09-25
  • 打赏
  • 举报
回复
既然这个最大数字是不确定的,也就是只能是个变量。 这个就比较复杂了。我建议你利用正则表达式提取该值,进行判断是否满足要求。

23,125

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧