求一时间的正则表达式: 如09:43:09-9:43:10,12:00:01-13:01:34
需要匹配小时、分钟、秒第一位为0,或者没有0的情况,时间段不限制,比如上面的串后面加个逗号又可以跟一个串,09:43:09-9:43:10,12:00:01-13:01:...
需要匹配小时、分钟、秒第一位为0,或者没有0的情况,时间段不限制,比如上面的串后面加个逗号又可以跟一个串,09:43:09-9:43:10,12:00:01-13:01:34,15:30:1-23:9:1 ...
展开
3个回答
展开全部
:^0[1-9]$ 如果第一位是0,则后面必须不为0
1.2:^[1-9][0-9]?$ 如果第一位不是0,则后面则任意
2.看包含小数点时
2.1 整数部分全为0
2.1.1:^00?\.0[1-9]$ 如果整数部分全部为0,小数第一位为0,则小数第二位就一定不为0
2.1.2:^00?\.[1-9][0-9]?$ 如果整数部分全部为0,小数第一位不为0,则第二位任意
结合2.1起来:^00?\.(?:0[1-9]|[1-9][0-9]?)$
2.1 整数部分不全为0
2.2.1:^0[1-9]\.[0-9]$ 如果整数部分第一位是0,第二位不为0,则小数部分任意
2.2.2:^[1-9][0-9]?\.[0-9]$ 如果整数部分第一位不为0,第二位任意,则小数部分任意
结合2.2起来:^(?:0[1-9]|[1-9][0-9]?)\.[0-9]$
全部就是:
^0[1-9]$|^[1-9][0-9]?$|^00?\.(?:0[1-9]|[1-9][0-9]?)$|^(?:0[1-9]|[1-9][0-9]?)\.[0-9]$
看起来是不是头晕,
判断具体的有限制的浮点数,有更多容易的方法,例如用你所熟悉的脚本语言,js,asp,vbs,php等等
if(小数点是否存在)
{//小数点存在
if(当整数部分"数值"大于0)
{
只用判断小数部分是二位,满足条件返回
}
else
{
整数数值等于0,只用判断小数"数值"大于0且位数小于2,满足条件返回
}
else{
小数点不存在,就是正整数,只用判断"数值"大于0且位数小于2,,满足条件返回
}
正则用来匹配字符很容易,但是这里直接用数值来判断比正则容易的多..
如果我分析有错误的地方,请指正
1.2:^[1-9][0-9]?$ 如果第一位不是0,则后面则任意
2.看包含小数点时
2.1 整数部分全为0
2.1.1:^00?\.0[1-9]$ 如果整数部分全部为0,小数第一位为0,则小数第二位就一定不为0
2.1.2:^00?\.[1-9][0-9]?$ 如果整数部分全部为0,小数第一位不为0,则第二位任意
结合2.1起来:^00?\.(?:0[1-9]|[1-9][0-9]?)$
2.1 整数部分不全为0
2.2.1:^0[1-9]\.[0-9]$ 如果整数部分第一位是0,第二位不为0,则小数部分任意
2.2.2:^[1-9][0-9]?\.[0-9]$ 如果整数部分第一位不为0,第二位任意,则小数部分任意
结合2.2起来:^(?:0[1-9]|[1-9][0-9]?)\.[0-9]$
全部就是:
^0[1-9]$|^[1-9][0-9]?$|^00?\.(?:0[1-9]|[1-9][0-9]?)$|^(?:0[1-9]|[1-9][0-9]?)\.[0-9]$
看起来是不是头晕,
判断具体的有限制的浮点数,有更多容易的方法,例如用你所熟悉的脚本语言,js,asp,vbs,php等等
if(小数点是否存在)
{//小数点存在
if(当整数部分"数值"大于0)
{
只用判断小数部分是二位,满足条件返回
}
else
{
整数数值等于0,只用判断小数"数值"大于0且位数小于2,满足条件返回
}
else{
小数点不存在,就是正整数,只用判断"数值"大于0且位数小于2,,满足条件返回
}
正则用来匹配字符很容易,但是这里直接用数值来判断比正则容易的多..
如果我分析有错误的地方,请指正
展开全部
你是要获取时间呢,还是时间段呢?
不过显然你已经能做到单个时间的捕获了,虽然细节稍有错误(纠正见下)。
捕获一个时间段就是把你的串重复一遍,中间加上分隔符-。
捕获多个时间段,按照意图,可分为两种:
1、逐一获取各个时间段,这只要程序加个循环,匹配一次,收集一个结果,直到无法再次匹配就行了。
2、将一连串时间段捕获成一个长串,越长越好,则正则表达式如下:
((0?[0-9]|1[0-9]|2[0-3]):([1-5][0-9]|0?[0-9]):([1-5][0-9]|0?[0-9])-(0?[0-9]|1[0-9]|2[0-3]):([1-5][0-9]|0?[0-9]):([1-5][0-9]|0?[0-9]),?)+
特别注意:关于秒的匹配,发现(0?[0-9]|[1-5][0-9])有些问题,最后一个数字有时匹配不到,而颠倒一下顺序,写成([1-5][0-9]|0?[0-9])就正确,原因一时分析不出来。
不过显然你已经能做到单个时间的捕获了,虽然细节稍有错误(纠正见下)。
捕获一个时间段就是把你的串重复一遍,中间加上分隔符-。
捕获多个时间段,按照意图,可分为两种:
1、逐一获取各个时间段,这只要程序加个循环,匹配一次,收集一个结果,直到无法再次匹配就行了。
2、将一连串时间段捕获成一个长串,越长越好,则正则表达式如下:
((0?[0-9]|1[0-9]|2[0-3]):([1-5][0-9]|0?[0-9]):([1-5][0-9]|0?[0-9])-(0?[0-9]|1[0-9]|2[0-3]):([1-5][0-9]|0?[0-9]):([1-5][0-9]|0?[0-9]),?)+
特别注意:关于秒的匹配,发现(0?[0-9]|[1-5][0-9])有些问题,最后一个数字有时匹配不到,而颠倒一下顺序,写成([1-5][0-9]|0?[0-9])就正确,原因一时分析不出来。
追问
感谢您的回答,我的目的是校验时间串是否合法,
比如
1、"09:43:09-9:43:10 ,”多了一个逗号,认为匹配,
2、",09:43:09-9:43:10 ” 认为失败。
3、“09:43:09-9:43:10 ,,19:43:09-21:43:10 ”、“,09:43:09-9:43:10 ,19:43:09-21:43:10 ”都认为失败。
也就是当只有一个时间段时,前后都不能有逗号或其他符号;两个或两个以上的情况最前面和最后面不能有其他符号,相邻的两个直接只允许有一个逗号.
再次感谢您的回答:)
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
JS:
var reg=/(0\d|1\d|2[0-3]|[1-9]):(0\d|[1-5]\d|[1-9]):(0\d|[1-5]\d|[1-9])-(0\d|1\d|2[0-3]|[1-9]):(0\d|[1-5]\d|[1-9]):(0\d|[1-5]\d|[1-9])/gm
var s='09:43:09-9:43:10,12:00:01-13:01:34,15:30:1-25:9:1'
while((v=reg.exec(s))!=null){
WScript.echo(v[0])
}
var reg=/(0\d|1\d|2[0-3]|[1-9]):(0\d|[1-5]\d|[1-9]):(0\d|[1-5]\d|[1-9])-(0\d|1\d|2[0-3]|[1-9]):(0\d|[1-5]\d|[1-9]):(0\d|[1-5]\d|[1-9])/gm
var s='09:43:09-9:43:10,12:00:01-13:01:34,15:30:1-25:9:1'
while((v=reg.exec(s))!=null){
WScript.echo(v[0])
}
追问
感谢回答,不过要求C/C++的正则:)
单个时间已经可以获取^(0?[1-9]|1[0-9]|2[0-3]):(0?[0-9]|[0-5][0-9]):(0?[0-9]|[0-5][0-9])$
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询