我不能为我的生活似乎弄清楚如何使用格式设置元素的正则表达式。
1d 5h 6m 12s
并允许它有任何变体,如
1d
1d 1h
1d 1h 1m
1d 1s
6m 12s
etc...
正则表达式是否可以进行格式化?
答案 0 :(得分:4)
假设您需要订购,
if (/^\s*(?:(?:[1-9]\d*|0)d\s+)?(?:(?:1?\d|2[0-3])h\s+)?(?:[1-5]?\dm\s+)?(?:[1-5]?\ds)?\s*$/.test(str))
{
// success
}
以下是一个快速细分:
^
和$
被称为 anchors 。它们匹配字符串的开头和结尾,因此您匹配整个字符串,而不仅仅是一个部分,例如 hello, world! 1d 5h 6m 12s
否则会传递。
\s*
和\s+
匹配零个或多个,以及一个或多个空格字符。
(?:[1-9]\d*|0)
匹配任意数量的数字,但不匹配以零开头的数字,除非它完全为零。
(?:1?\d|2[0-3])
匹配0到23之间的数字(包括0和23)。
[1-5]?\d
匹配0到59之间的数字(包括0和59)。
(?: ... )
称为非捕获组。它们就像括号(用于分组),除了普通的'括号捕获,我们在这里不需要它。
?
表示前一个实体是可选的。
答案 1 :(得分:0)
为您提供一个起点:
(\d+d){0,1} //days - not checking for a max
(((([0-1]){0,1}\d)|(2[0-4]))h){0,1} // 24 hours
(((([0-5]){0,1}[0-9])|(60))m){0,1} //60 minutes
(((([0-5]){0,1}[0-9])|(60))s){0,1} //60 seconds
然后把它们放在一起(在这种情况下不要担心空白量)
(\d+d){0,1}[ ]*(((([0-1]){0,1}\d)|(2[0-4]))h){0,1}[ ]*(((([0-5]){0,1}[0-9])|(60))m){0,1}[ ]*(((([0-5]){0,1}[0-9])|(60))s){0,1}[ ]*
从评论中包括@nhahtdh的上述改进版本。谢谢!
((\d+)d)? *(([01]?\d|2[0-4])h)? *(([0-5]?\d|60)m)? *(([0-5]?\d|60)s)? *
答案 2 :(得分:0)
我认为这就是你想要的:
function parse(s) {
y = s.match(/(?:(\d+)d\s*)?(?:(\d+)h\s*)?(?:(\d+)m\s*)?(?:(\d+)s)?/);
console.log(y);
return y;
}
以下是它的工作原理:
(\d+)d\s*
匹配一些数字,后跟d
,后跟可选的空格(?:...)?
中,与(?:(\d+)d\s*)?
一样,使上述选项成为可能。 ?:
导致新的括号组不是捕获组。