我想验证一个由任意数字后跟特定字符组成的字符串,例如:
"1w 3d 5h 3m" 和 "32d 5h 3m"
目前我正在使用以下正则表达式:/\d+[wdhm]\z/
但如果一个字符串包含我不想要的字母,则无法匹配,例如:
"3pp 2h 35m" 和 "2d 5qq 3m"
字符串中唯一允许出现的字符为 "w"、"d"、"h" 和 "m",如果存在这些字符,则必须按照相应的顺序排列,例如 "2d 35m" 是可以接受的,但 "3h 1w" 不行,因为它的顺序错误。
^(?=\d)(?:\d+w\h*)?(?:\d+d\h*)?(?:\d+h\h*)?(?:\d+m)?$
正则表达式详解:
^
:起始位置(?=\d)
:前瞻断言,匹配包含数字的内容以防止空匹配(?:\d+w\h*)?
:匹配一个或多个数字、后接 w
和 0 个或多个空格(?:\d+d\h*)?
:匹配一个或多个数字、后接 d
和 0 个或多个空格(?:\d+h\h*)?
:匹配一个或多个数字、后接 h
和 0 个或多个空格(?:\d+m)?
:匹配一个或多个数字、后接 m
$
:结束位置如果不想允许组件之间有零间隔,则使用:
^(?=\d)(?:\d+w\h*)?(?:\b\d+d\h*)?(?:\b\d+h\h*)?(?:\b\d+m)?$
如果你想只允许单个空格,请使用:
^(?=\d)(?:\d+w\h)?(?:\b\d+d\h)?(?:\b\d+h\h)?(?:\b\d+m)?$
^(\d+w )?(\d+d )?(\d+h )?(\d+m)$
。 - User863