Javascript 如果没有任何组返回结果,如何构建不返回空字符串的正则表达式

Javascript 如果没有任何组返回结果,如何构建不返回空字符串的正则表达式,javascript,regex,Javascript,Regex,我正在尝试构建一个正则表达式来匹配时间表小时数条目,其中用户以20h50m格式输入他的小时数 在此格式中,用户可以只输入小时20h,或只输入分钟50m,或同时输入小时和分钟20h 50m 样本匹配 45m 1h 2h 45m 数字可以是20或50以外的任何数字 我提出了这个正则表达式(([0-9]+h)\s([0-9]+m))|([0-9]+h)([0-9]+m)){1},它很长,我正在尝试减少它 所以我尝试了不同的解决方案:(\d+h)?([\s]*(\d+m))?。但是这个解决方案的问题是

我正在尝试构建一个正则表达式来匹配时间表小时数条目,其中用户以
20h50m
格式输入他的小时数

在此格式中,用户可以只输入小时
20h
,或只输入分钟
50m
,或同时输入小时和分钟
20h 50m

样本匹配

45m
1h
2h 45m
数字可以是
20
50
以外的任何数字

我提出了这个正则表达式(([0-9]+h)\s([0-9]+m))|([0-9]+h)([0-9]+m)){1},它很长,我正在尝试减少它

所以我尝试了不同的解决方案:
(\d+h)?([\s]*(\d+m))?
。但是这个解决方案的问题是它匹配空字符串,并且不匹配像
2h 45m
这样的模式

如何修改最后一个正则表达式,使其与以下格式匹配

45m
1h
2h 45m
以下是我的看法:

/(?<=\b)\d+h \d+m|\d+[hm](?=\b)/g
/(?

我认为它会起作用。

要匹配所有变化,您可以使用

\b(?:\d+h(?: \d+m)?|\d+m)\b
解释

  • \b
    单词边界
  • (?:
    非捕获组
    • \d+h
      匹配1+位和
      h
    • (?:\d+m)?
      可以选择匹配一个小零件
    • |
    • \d+m
      匹配1+位和
      m
  • 关闭组
  • \b
    单词边界

如果您希望按该顺序匹配小时和分钟,可以使用锚定
^
$

^(?:\d+h(?: \d+m)?|\d+m)$

您当前的正则表达式也匹配
999m
-这是预期的吗
4m 4h
是有效的格式吗?
\s
不是您想要的(
[\f\n\r\t\v  -      ])。要精确匹配空格,请使用``。您的代码也匹配
23ms
^(?:\d+h(?: \d+m)?|\d+m)$