正则表达式javascript数字和字母
我一辈子都搞不懂如何用格式设置元素的正则表达式正则表达式javascript数字和字母,javascript,regex,formatting,Javascript,Regex,Formatting,我一辈子都搞不懂如何用格式设置元素的正则表达式 1d 5h 6m 12s 并且允许它有任何变化,比如 1d 1d 1h 1d 1h 1m 1d 1s 6m 12s etc... 正则表达式可以进行这种格式设置吗?假设需要按顺序设置 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 }
1d 5h 6m 12s
并且允许它有任何变化,比如
1d
1d 1h
1d 1h 1m
1d 1s
6m 12s
etc...
正则表达式可以进行这种格式设置吗?假设需要按顺序设置
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
}
下面是一个快速细分:
^
和$
称为锚定。它们匹配字符串的开头和结尾,因此您匹配的是整个字符串,而不仅仅是一部分,例如,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)(?:…)
称为非捕获组。它们类似于括号(用于分组),除了普通的ol'括号捕获,我们这里不需要它?
表示前面的实体是可选的假设你需要它来维持秩序
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
}
下面是一个快速细分:
^
和$
称为锚定。它们匹配字符串的开头和结尾,因此您匹配的是整个字符串,而不仅仅是一部分,例如,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)(?:…)
称为非捕获组。它们类似于括号(用于分组),除了普通的ol'括号捕获,我们这里不需要它?
表示前面的实体是可选的给你一个起点:
(\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
然后将它们放在一起(在本例中,不必担心空格的数量)
包括@nhahdh在评论中对上述内容的改进版本。谢谢
((\d+)d)? *(([01]?\d|2[0-4])h)? *(([0-5]?\d|60)m)? *(([0-5]?\d|60)s)? *
给你一个起点:
(\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
然后将它们放在一起(在本例中,不必担心空格的数量)
包括@nhahdh在评论中对上述内容的改进版本。谢谢
((\d+)d)? *(([01]?\d|2[0-4])h)? *(([0-5]?\d|60)m)? *(([0-5]?\d|60)s)? *
我想这就是你想要的:
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*)?
导致新的括号集不是捕获组?:
- 重复h、m和s,你就完成了
- 我想这就是你想要的:
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*)?
导致新的括号集不是捕获组?:
- 重复h、m和s,你就完成了
test()
notmatch()
,但这在“1d 1h”等示例输入上失败。问题在于组外的\s+
。请注意,这将在换行符和制表符上匹配。如果只需要布尔结果,则使用test()
notmatch()
,但在“1d 1h”等示例输入上失败。问题是组外的\s+
。我发现其中一个是多余的(已修复)。我认为其余的都是必需的