-4

我有一个代表持续时间的字符串。 它可以像以下之一:

10d12h59m

10d12h

10天

12小时

70

“d”前面的数字代表天,“h”前面的数字代表小时,“m”前面的数字代表分钟,如果它只是数字,则表示分钟。

我想要一个匹配该字符串的 javascript 正则表达式。

4

5 回答 5

1

如果您只想检查它是否匹配:/^(?:\d+d(?:\d+h(?:\d+m)?)|\d+[dh]?)$/

例子:

"10d12h59m".match(/^(?:\d+d(?:\d+h(?:\d+m)?)|\d+[dh]?)$/); // Array ["10d12h59m"]
"10d12h".match(/^(?:\d+d(?:\d+h(?:\d+m)?)|\d+[dh]?)$/); // Array ["10d12h"]
"10d".match(/^(?:\d+d(?:\d+h(?:\d+m)?)|\d+[dh]?)$/); // Array ["10d"]
"12h".match(/^(?:\d+d(?:\d+h(?:\d+m)?)|\d+[dh]?)$/); // Array ["12h"]
"70".match(/^(?:\d+d(?:\d+h(?:\d+m)?)|\d+[dh]?)$/); //Array ["70"]

"foobar".match(/^(?:\d+d(?:\d+h(?:\d+m)?)|\d+[dh]?)$/); // null
"10d50m".match(/^(?:\d+d(?:\d+h(?:\d+m)?)|\d+[dh]?)$/); // null
于 2013-01-30T11:08:11.167 回答
0

试试这个:

/(\d\d[dhm]?){1,3}/

这将匹配您的所有示例。

这个怎么运作:

# \d\d   - Match 2 digits
# [dhm]? - followed by a optional d, h, or m.
# {1,3}  - and make sure there's 1, 2 or 3 of the previous.

如果您还想传递一位数或 99 以上的数字,请使用此正则表达式:

/(\d+[dhm]?){1,3}/
//  ^ Note the added +, instead of \d
于 2013-01-30T10:49:31.183 回答
0

使用这个正则表达式(\d+[dmh]?)+

于 2013-01-30T10:53:12.983 回答
0

试试这个:

/(\d+d)?(\d+h)?(\d+m?)?/

在每个匹配的组上,您都可以轻松申请parseInt(…, 10)

于 2013-01-30T10:53:32.087 回答
0

要将字符串解析为小时、天和分钟:

function parseDuration(s) {
  var m = /(?:(\d+)d)?(?:(\d+)h)?(?:(\d+)m?)?/.exec(s);
  return {
    days: parseInt(m[1], 10) || 0,
    hours: parseInt(m[2], 10) || 0,
    minutes: parseInt(m[3], 10) || 0
  };
}

演示:http: //jsfiddle.net/Guffa/9hj5F/

编辑:

要验证字符串,您可以使用具有三种不同变体(dhm、dh 和 d 都可以是相同变体,带有可选部分)的模式进行基本验证,例如:^(\d+d(\dh(\d+m)?)?|\d+h|\d+m?)$.

如果您还想限制这些值,例如,您可以使用[0-5]?\d而不是\d+将值限制为 0 到 59,或者[0-5]\d需要两位数,即 00-59。

于 2013-01-30T10:59:58.547 回答