5 个回答

首先解决这个d-d,hh:mm-hh:mm的正则:
d是1-7,那就[1-7]不过分吧。
然后hh是第一个h是0-2,然后第一个h是2的话,第二个h只能是0-4,其他情况0-9.
mm 就比较简单了 第一个m:0-5,第二个:0-9
所以正则是:[1-7]-[1-7],([0|1][0-9]|2[0-3]):([0-5][0-9])-([0|1][0-9]|2[0-3]):([0-5][0-9])

再然后就是分隔符的正则,简化一下:A;A,需要做的是要么只有一个A,要么有多个;A在后面跟着,那其实就是^A(;A)*$

再把两个组合一下:

^([1-7]-[1-7],([0|1][0-9]|2[0-3]):([0-5][0-9])-([0|1][0-9]|2[0-3]):([0-5][0-9]))(;([1-7]-[1-7],([0|1][0-9]|2[0-3]):([0-5][0-9])-([0|1][0-9]|2[0-3]):([0-5][0-9])))*$

可以去这里写正则验证看看>>
image.png

不过我看你题目里还允许有24:00的格式,被我排除掉了,如果需要的话,可自行调整哈。

image.png

/^\d-\d,\d{2}:\d{2}-\d{2}:\d{2}(;\d-\d,\d{2}:\d{2}-\d{2}:\d{2})*$/.test

就是你先写一遍。然后重复次数任意。

看了楼下的答案,哈哈哈我不应该全用 \d, 每一个位置应该设定对应的时间范围

已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

这个没必要用正则,格式对不等于符合要求。比如结束时间应大于开始时间靠正则无法保证的。
实际界面应该用多个组件给用户录入,然后拼合为字符串,而不是让用户自己敲这个字符串。

已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

d

[1-7]

hh

(?:[01]\d|2[0-4])

mm

[0-5]\d

d-d,hh:mm-hh:mm

[1-7]-[1-7],(?:[01]\d|2[0-4]):[0-5]\d-(?:[01]\d|2[0-4]):[0-5]\d

d-d,hh:mm-hh:mm;d-d,hh:mm-hh:mm...

[1-7]-[1-7],(?:[01]\d|2[0-4]):[0-5]\d-(?:[01]\d|2[0-4]):[0-5]\d(?:;[1-7]-[1-7],(?:[01]\d|2[0-4]):[0-5]\d-(?:[01]\d|2[0-4]):[0-5]\d)*

完整正则

/^[1-7]-[1-7],(?:[01]\d|2[0-4]):[0-5]\d-(?:[01]\d|2[0-4]):[0-5]\d(?:;[1-7]-[1-7],(?:[01]\d|2[0-4]):[0-5]\d-(?:[01]\d|2[0-4]):[0-5]\d)*$/

数据的验证其实不止正则一种方法,要结合实际来处理。

用了正则式,不表示不能用其它方法。
这里其实从信息提取来说,就是先用;分隔为多个时间段
每个时间段又可以用,分隔为d部分和hh:mm部分
d部分和hh:mm部分还可以用-分隔为2个分部,
这时再用正则式来判断其实就很简单啦
对于d的各个分部就是/^[1-7]$/
对于hh:mm的各个分部就是/^([01]\d|2[0-4]):[0-5]\d$/
这样分隔开的好处是还可以有更复杂的比较,比如要求d分隔的部分,后面一个要不小于前面一个,hh:mm分隔的也类似。对此,正则式用于基本格式比较判断,真正的数值比较还可以引入其它方法。

已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题