PHP正则表达式:匹配任意数字,后跟特定字符。

3

我想验证一个由任意数字后跟特定字符组成的字符串,例如:

"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+w )?(\d+d )?(\d+h )?(\d+m)$ - User863
1个回答

4
您可以使用带有多个可选匹配和前瞻的正则表达式来实现此功能:
^(?=\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)?$

正则表达式演示2

如果你想只允许单个空格,请使用:

^(?=\d)(?:\d+w\h)?(?:\b\d+d\h)?(?:\b\d+h\h)?(?:\b\d+m)?$

正则表达式演示 3


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接