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]+)?$

ただし、値が 1 つだけで区切り記号がない場合は、1 分と見なされます。

'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

2 番目のグループをオプションにしないでください。コロンを非キャプチャ グループでラップし、そのオプションを作成して + を * に置き換えます。^(?:([0-9]*):)?([0-9]*)$

于 2013-06-13T18:01:36.797 に答える
1

次の正規表現を確認してください。

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

Scriptular Test here .

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 に答える
0

次の正規表現は次のようです。

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

テスト ケースを参照してください。

于 2013-06-14T01:58:44.340 に答える
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 に答える