求一时间的正则表达式: 如09:43:09-9:43:10,12:00:01-13:01:34

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求一时间的正则表达式: 如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:34,15:30:1-23:9:1 ...

:^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,,满足条件返回

正则用来匹配字符很容易,但是这里直接用数值来判断比正则容易的多..
如果我分析有错误的地方,请指正
参考技术A 你是要获取时间呢,还是时间段呢?
不过显然你已经能做到单个时间的捕获了,虽然细节稍有错误(纠正见下)。
捕获一个时间段就是把你的串重复一遍,中间加上分隔符-。
捕获多个时间段,按照意图,可分为两种:
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 ”都认为失败。
也就是当只有一个时间段时,前后都不能有逗号或其他符号;两个或两个以上的情况最前面和最后面不能有其他符号,相邻的两个直接只允许有一个逗号.
再次感谢您的回答:)

本回答被提问者采纳
参考技术B 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])
追问

感谢回答,不过要求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])$

正则表达式匹配涉及上午/下午的时间范围,如上午 7 点至晚上 10 点

【中文标题】正则表达式匹配涉及上午/下午的时间范围,如上午 7 点至晚上 10 点【英文标题】:Regex to match time ranges involving am/pm like 7am-10pm 【发布时间】:2015-06-20 13:33:17 【问题描述】:

我写了下面的正则表达式

(1[012]|[1-9])(am|pm)\-(1[012]|[1-9])(am|pm)

匹配以下时间格式:

7am-10pm (matches correctly and creates 4 match groups 7, am, 10, pm)

13am-10pm (this should not be matched, however it matches and creates 4 match groups 3, am, 10, pm)

10pm (this doesn't match as expected because it doesn't specify the time range end)

111am-10pm (this should not be matched, however it matches and creates 4 match groups 11, am, 10, pm)

如何改进我的正则表达式,这样我就不需要重复数字和 am/pm 模式以及以下内容:

    它仅捕获时间范围组件,例如上午 7 点至上午 10 点应该只有 2 个匹配组,上午 7 点、上午 10 点。

    它只匹配正确的时间,例如上午 111 点或下午 13 点等应被视为不匹配。

    我不知道是否可以使用正则表达式,但我们可以让正则表达式匹配正确的时间范围,例如7am-1pm 应该匹配,但是 4pm-1pm 应该被视为不匹配?

注意:我使用的是 Ruby 2.2.1

谢谢。

【问题讨论】:

【参考方案1】:

首先让我们看看你做错了什么:

13am-10pm(这不应该匹配,但是它匹配并创建了 4 个匹配组 3、am、10、pm)

它只匹配适当的时间,例如上午 111 点或下午 13 点等应被视为不匹配。

这匹配,因为您允许在此处匹配单个数字 [1-9]:(1[012]|[1-9])。

为了解决这个问题,您应该允许一个 [1-9] 数字,或 1 + [0-2]。由于我们不知道正则表达式何时开始,我们将使用一些单词边界来确保我们有一个“单词开始”。

由于您不想捕获数字而是整个时间加上 am|pm,您可以使用非捕获组:

\b((?:1[0-2]|[1-9])

那么这只是重复我们自己并添加破折号的问题:

\b((?:1[0-2]|[1-9])[ap]m)-((?:1[0-2]|[1-9])[ap]m)

关于第 3 点。嗯,是的,您可以使用正则表达式执行此操作,但最好在获得第 1 组和第 2 组后简单地添加一个逻辑检查以查看时间范围是否真的有道理。

总而言之,这就是你得到的:

# \b((?:1[0-2]|[1-9])[ap]m)-((?:1[0-2]|[1-9])[ap]m)
# 
# 
# Assert position at a word boundary «\b»
# Match the regular expression below and capture its match into backreference number 1 «((?:1[0-2]|[1-9])[ap]m)»
#    Match the regular expression below «(?:1[0-2]|[1-9])»
#       Match either the regular expression below (attempting the next alternative only if this one fails) «1[0-2]»
#          Match the character “1” literally «1»
#          Match a single character in the range between “0” and “2” «[0-2]»
#       Or match regular expression number 2 below (the entire group fails if this one fails to match) «[1-9]»
#          Match a single character in the range between “1” and “9” «[1-9]»
#    Match a single character present in the list “ap” «[ap]»
#    Match the character “m” literally «m»
# Match the character “-” literally «-»
# Match the regular expression below and capture its match into backreference number 2 «((?:1[0-2]|[1-9])[ap]m)»
#    Match the regular expression below «(?:1[0-2]|[1-9])»
#       Match either the regular expression below (attempting the next alternative only if this one fails) «1[0-2]»
#          Match the character “1” literally «1»
#          Match a single character in the range between “0” and “2” «[0-2]»
#       Or match regular expression number 2 below (the entire group fails if this one fails to match) «[1-9]»
#          Match a single character in the range between “1” and “9” «[1-9]»
#    Match a single character present in the list “ap” «[ap]»
#    Match the character “m” literally «m»

【讨论】:

【参考方案2】:

您的正则表达式中缺少^(行首),这就是它在两者之间匹配的原因。

你必须使用:

^(1[012]|[1-9])(am|pm)\-(1[012]|[1-9])(am|pm)

更好的解决方案:如果您的模式并不总是从新行开始,您也可以使用\b(边界)。

\b(1[012]|[1-9])(am|pm)\-(1[012]|[1-9])(am|pm)\b

见DEMO。

【讨论】:

以上是关于求一时间的正则表达式: 如09:43:09-9:43:10,12:00:01-13:01:34的主要内容,如果未能解决你的问题,请参考以下文章

如何用正则表达式检测ip是不是正确,求详解

求固定电话JS正则表达式

求正则表达式提取上一级目录名如./index_2.html

留言板过滤 脏字 问题 求 一个能用的 正则表达式匹配并替换. 如过滤 TextBox1 里面的文本

求VBA中一简单正则表达式

mysql 正则表达式求解答