0

我正在尝试解析包含由 . 分隔的分钟和秒的字符串:。min 和 secs 都是可选的(不过需要提供一个)。这是我希望从我的正则表达式中得到的:

'0'    // => '', '0'
'30'   // => '', '30'
':30'  // => '', '30'
'1:'   // => '1', ''
'1:30' // => '1', '30'

不需要获取一个空字符串,它将使用parseInt(value, 10) || 0afterwhile 进行解析,所以它可以是0, '', undefined, ...

我试过这个正则表达式:

^([0-9]+)?:?([0-9]+)?$

但是当只有一个值并且没有分隔符时,它被认为是一分钟:

'0'    // => '0', ''   <= wrong result
'30'   // => '30', ''  <= wrong result
':30'  // => '', '30'
'1:'   // => '1', ''
'1:30' // => '1', '30'

您可以在此处查看测试用例

任何的想法?


编辑:我当前的实现(没有正则表达式)看起来像这样:

var min, parts, sec, bp;
bp = '1:30';
parts = bp.split(':');

if (parts.length === 2) {
  min = parts[0];
  sec = parts[1];
} else {
  min = 0;
  sec = parts[0];
}
4

6 回答 6

3

不要使第二组可选,将冒号包装在非捕获组中并设置该选项并将 + 替换为 *^(?:([0-9]*):)?([0-9]*)$

于 2013-06-13T18:01:36.797 回答
1

检查以下正则表达式:

^(?:(?:(\d+):)?|:)(\d*)$

在这里进行脚本测试

var min, match, sec, bp;
bp = '1:30';
match = /^(?:(?:(\d+):)?|:)(\d*)$/.exec(bp);
min = parseInt(match[1], 10) || 0;
sec = parseInt(match[2], 10) || 0;

输出:

0     -> min: 0 sec: 0
30    -> min: 0 sec: 30
:30   -> min: 0 sec: 30
1:    -> min: 1 sec: 0
1:30  -> min: 1 sec: 30 

JavaScript 演示在这里

于 2013-06-13T18:41:20.407 回答
1

在您的正则表达式中,所有内容都是可选的,如果只有一个数字存在,它将与第一组匹配。您需要将以下冒号作为该捕获组的要求(但不是其中的一部分,因此请使用额外的非捕获组):

^(?:([0-9]*):)?([0-9]*)$
var parts = bp.match(/^(?:(\d*):)?(\d*)$/);
if (parts)
    var min = +parts[1] || 0, // can be undefined if no colon
        sec = +parts[2];
else
    throw new SyntaxError("Invalid 'min:sec' format");

顺便说一句,如果您parseInt无论如何都在使用,那么捕获结肠不会受到伤害。那么最简单(最短)的就是(\d*:)?(\d*)

var parts = bp.match(/^(\d*:)?(\d*)$/);
if (parts)
    var min = parseInt(parts[1], 10) || 0,
        sec = parseInt(parts[2], 10) || 0;
else
    throw new SyntaxError("Invalid 'min:sec' format");
于 2013-06-13T22:37:50.520 回答
0

这个怎么样:

^([0-9]+:)?([0-9]+)?$
于 2013-06-13T18:01:08.970 回答
0

我希望这对您有所帮助,并且您希望得到一个数组作为结果:

function parseTime(time){

  var tranfTime = time.replace(':',',').split(',');

  if(time.length > 2 || time[1] === ':'){
    time = tranfTime;
  }
  else{
    time = [''].concat(tranfTime);
  }

  return time;
}

parseTime('1:30') -> ['1','30']
于 2013-06-13T18:36:53.243 回答
0

以下正则表达式似乎是一个:

^(?:(\d+):)?:?(\d+)?$

请参阅测试用例

于 2013-06-14T01:58:44.340 回答