正则表达式javascript数字和字母

时间:2013-02-08 14:21:13

标签: javascript regex formatting

我不能为我的生活似乎弄清楚如何使用格式设置元素的正则表达式。

1d 5h 6m 12s

并允许它有任何变体,如

1d 

1d 1h

1d 1h 1m 

1d 1s

6m 12s 

etc...

正则表达式是否可以进行格式化?

3 个答案:

答案 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
}

以下是一个快速细分:

  1. ^$被称为 anchors 。它们匹配字符串的开头和结尾,因此您匹配整个字符串,而不仅仅是一个部分,例如 hello, world! 1d 5h 6m 12s否则会传递。

  2. \s*\s+匹配零个或多个,以及一个或多个空格字符。

  3. (?:[1-9]\d*|0)匹配任意数量的数字,但不匹配以零开头的数字,除非它完全为零。

  4. (?:1?\d|2[0-3])匹配0到23之间的数字(包括0和23)。

  5. [1-5]?\d匹配0到59之间的数字(包括0和59)。

  6. (?: ... )称为非捕获组。它们就像括号(用于分组),除了普通的'括号捕获,我们在这里不需要它。

  7. ?表示前一个实体是可选的。

答案 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*)?一样,使上述选项成为可能。 ?:导致新的括号组不是捕获组。
  • 重复h,m和s,你就完成了。