RegEx:日期/时间(子)字符串

laik7k3q  于 2023-01-31  发布在  其他
关注(0)|答案(1)|浏览(110)

我正在尝试使用RegEx验证用户对日期/时间字段的输入,格式如下:由于用户将一次键入这一个字符,所以RegEx还需要允许所有子串(例如,yyyy-mmyyyy-mm-dd H等)。
例如,下面的日期2022-01-29 11:59或它的任何子字符串,如(空字符串)、2022022-01-2022-01-29等应匹配。类似2022-13222-2024-01-01 23:111的字符串不应匹配。
我在尝试,

[0-9]{4}?-?(0[1-9]|1[0-2])-?(0[1-9]|[1-2][0-9]|3[0-1])? ?(2[0-3]|[01][0-9])?:?[0-5]?[0-9]?$

使每个字符都是可选的,但它不起作用,因为它可能只是跳过字符串的一部分,例如2022-29返回match...

qojgxg4l

qojgxg4l1#

如果你想在输入的时候正确匹配数字范围,这就有点复杂了。下面是一个正则表达式解决方案,它有很多嵌套的组(允许部分输入),并验证月、日、小时和分钟的范围:

const regex = /^([0-9]{0,3}|[0-9]{4}(-([01]|(0[1-9]|1[0-2])(-([0-3]|(0[1-9]|[12][0-9]|3[01])( ([0-2]|([0-1][0-9]|2[0-3])(:([0-5]|([0-4][0-9]|5[0-9]))?)?)?)?)?)?)?)?)$/;

[
  '',
  '2',
  '20',
  '202',
  '2022',
  '2022-',
  '2022-0',
  '2022-01',
  '2022-01-',
  '2022-01-2',
  '2022-01-29',
  '2022-01-29 ',
  '2022-01-29 1',
  '2022-01-29 11',
  '2022-01-29 11:',
  '2022-01-29 11:5',
  '2022-01-29 11:59',
  '202-01',
  '2022-1-1',
  '2022-13',
  '2022-01-32',
  '2024-01-01 24',
  '2024-01-01 01:60',
  '2024-01-01 23:111'
].forEach(str => console.log(str, '=>', regex.test(str)));

输出:

=> true
2 => true
20 => true
202 => true
2022 => true
2022- => true
2022-0 => true
2022-01 => true
2022-01- => true
2022-01-2 => true
2022-01-29 => true
2022-01-29  => true
2022-01-29 1 => true
2022-01-29 11 => true
2022-01-29 11: => true
2022-01-29 11:5 => true
2022-01-29 11:59 => true
202-01 => false
2022-1-1 => false
2022-13 => false
2022-01-32 => false
2024-01-01 24 => false
2024-01-01 01:60 => false
2024-01-01 23:111 => false

正则表达式的层次结构:

  • ^(-字符串和组的开始
  • [0-9]{0,3}--0至3位数,部分年份
  • |-逻辑或
  • 一米三氮一
  • 一米四氮一
  • ---破折号
  • (--
  • [01]--月份的一位数字
  • |-逻辑或
  • (0[1-9]|1[0-2])--月份的两位数字
  • 一米十纳一
  • ---破折号
  • 一米十二分一秒
  • [0-3]--日期的一位数字
  • |-逻辑或
  • (0[1-9]|[12][0-9]|3[01])--两位数字的日期
  • 一米十六分一秒
  • ``-空间
  • (--
  • [0-2]--一位数的小时
  • |-逻辑或
  • ([0-1][0-9]|2[0-3])--两位数的小时
  • 一米二十二分一秒--
  • :-冒号
  • 一米二十四分一秒--
  • [0-5]--分钟的一位数
  • |-逻辑或
  • ([0-4][0-9]|5[0-9])--两位数的分钟
  • 一米二十八分一秒
  • 一米二十九纳一
  • 一米三十分一秒
  • )?--
  • 一米三十二分一秒--
  • 一米三米一
  • )?--
  • 一米三十五纳一
  • )$-字符串和组的结尾

了解有关regex的更多信息:https://twiki.org/cgi-bin/view/Codev/TWikiPresentation2018x10x14Regex

相关问题