我有一个代表持续时间的字符串。 它可以像以下之一:
10d12h59m
10d12h
10天
12小时
70
“d”前面的数字代表天,“h”前面的数字代表小时,“m”前面的数字代表分钟,如果它只是数字,则表示分钟。
我想要一个匹配该字符串的 javascript 正则表达式。
我有一个代表持续时间的字符串。 它可以像以下之一:
10d12h59m
10d12h
10天
12小时
70
“d”前面的数字代表天,“h”前面的数字代表小时,“m”前面的数字代表分钟,如果它只是数字,则表示分钟。
我想要一个匹配该字符串的 javascript 正则表达式。
如果您只想检查它是否匹配:/^(?:\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
试试这个:
/(\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
使用这个正则表达式(\d+[dmh]?)+
试试这个:
/(\d+d)?(\d+h)?(\d+m?)?/
在每个匹配的组上,您都可以轻松申请parseInt(…, 10)
。
要将字符串解析为小时、天和分钟:
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。