我在撰写typscript正则表达式时遇到困难,并希望就如何最好地实现这一目标提出一些建议?
我正在尝试验证包含持续时间的字符串
例如1y 3d 5m"
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
答案 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)?$
它使用正向前瞻来确保整个事物不是空的,并且在每次匹配之后都是负向前瞻以确保它不能直接跟随下一个数字。每场比赛也是可选的。令人费解,但我认为它应该有效。
每个匹配部分之间需要1个空格。
这不会阻止您指定20485d
而不是将其规范化为数周/年 - 在代码中执行此操作。