我想验证严格格式化的“时间”。这个“时间”具有以下形式:
\d+d \d+h \d+m
其中“d”表示天,“h”表示小时,“m”表示分钟,每个数字的最小值为“1”。主要关注的是每个子字符串可能存在也可能不存在,但总会存在至少一个。此外,它们必须按照上面指定的顺序。
我的以下RegEx是验证格式的最佳方式吗? RegEx是简洁性和速度之间的最佳平衡吗?
(?=.+)^(?:(?:[1-9]|[1-9][0-9]+)d\s?)?(?:(?:[1-9]|1[0-9]|2[0-3])h\s?)?(?:(?:[1-9]|[1-5][0-9])m)?$
我已经包含了前瞻以确保空字符串不匹配。
我看到的唯一一个小问题是,如果没有正在进行的“m”值,“23h”之类的东西会匹配。 “d”也是如此。
答案 0 :(得分:1)
这是一个优化模式,严格检查您描述的格式:
^(?=\S)(?:[1-9][0-9]*d)?(?:(?:^| )(?:1[0-9]?|[3-9]|2[0-3]?)h)?(?:(?:^| )(?:[1-5][0-9]?|[6-9])m)?$
详细说明:
(?=\S)
确保模式中至少有一个组,并强制字符串不以空格开头。 (请注意,您只需找到一个字符)
[1-9][0-9]*d
比(?:[1-9]|[1-9][0-9]+)d
快,因为角色类[1-9]
只测试过一次。
(?:1[0-9]?|[3-9]|2[0-3]?)
比(?:[1-9]|1[0-9]|2[0-3])
略长,但效率更高,因为第一个数字只测试一次。替代品按概率排序(第一个为11/22,第二个为7/22,最后一个为4/22)
[1-5][0-9]?|[6-9]
也一样。
我假设组必须用空格分隔。为了确保这一点,我在第1组和第2组的末尾删除了\s?
,将(?:^| )
放在第2组和第3组的开头。只有两种可能性:该组正处于开始阶段或者之前有一个其他组和一个空格(记住,由于前瞻,你不能有空格而没有组)
您可以获得更长的图案(一个字符),但速度更快,更具约束力。如果你需要一个模糊的理由来减小模式的大小,你可以使用旧的子模式获得3个字符,用于组2和组3中的数字。