RegEx如何将字符串持续时间与可选条件匹配

时间:2018-02-13 11:17:13

标签: regex typescript time

我在撰写typscript正则表达式时遇到困难,并希望就如何最好地实现这一目标提出一些建议?

我正在尝试验证包含持续时间的字符串 例如1y 3d 5m"

  • 这可能包含以下任何一个数字
    • y - 岁
    • w - 周
    • d - Days
    • h - 小时
    • m - 分钟
    • s - 秒
    • ms - 毫秒
  • 它可以包含1 or more以下单位
  • 它们应该按照上面列出的最大量级发生
    • 1y必须在1d
    • 之前
  • 如果存在多个单位,则必须用空格分隔
    • 这是我遇到问题

我目前有以下内容,但它没有正确验证所需的空格,它允许例如1y1d,它应该是无效的。

^[ ]*(\d+y)?^|[ ]*(\d+w)?^|[ ]*(\d+d)?^|[ ]*(\d+h)?[ ]*(\d+m)?[ ]*(\d+s)?[ ]*(\d+ms)?[ ]*$

示例

正确:

  • 1y 1w
  • 1d 1s
  • 1y 4d 2h

失败:

  • 1y1w
  • 1w 1y
  • 2weeks

1 个答案:

答案 0 :(得分:1)

您可以使用

^(?=\d[ywdhms])(( ?\d+y)?(?!\d))?(( ?\d+w)?(?!\d))?(( ?\d+d)?(?!\d))?(( ?\d+h)?(?!\d))?(( ?\d+m)?(?!\d))?(( ?\d+s)?(?!\d))?( ?\d+ms)?$

针对您的测试用例。

 ^                       - string start
 (?=\d[ywdhms])          - positive lookahead to prevent all emptyness
  (( ?\d+y)?(?!\d))?     - matches space + number + y, disallowes directly following number
  (( ?\d+w)?(?!\d))?     - matches space + number + d, disallowes directly following 
  (( ?\d+d)?(?!\d))?     - etc. spaces are optional, only enforced by negative lookahead
  (( ?\d+h)?(?!\d))?       for next number
  (( ?\d+m)?(?!\d))?
  (( ?\d+s)?(?!\d))?
  ( ?\d+ms)?$

它使用正向前瞻来确保整个事物不是空的,并且在每次匹配之后都是负向前瞻以确保它不能直接跟随下一个数字。每场比赛也是可选的。令人费解,但我认为它应该有效。

小提琴:https://regexr.com/3kn7u

每个匹配部分之间需要1个空格。

这不会阻止您指定20485d而不是将其规范化为数周/年 - 在代码中执行此操作。