JavaScript正则表达式:捕获可选组,同时具有严格匹配

时间:2017-02-22 17:14:52

标签: javascript regex

我正在尝试从用户输入中提取一些应遵循以下格式的数据:1d 5h 30m,这意味着用户输入的时间为1天,5小时30分钟。

我试图提取输入的每个部分的值。但是,每个组都是可选的,这意味着2h 20m是有效的输入。

我试图在输入中保持灵活性(在某种意义上并非所有部分都需要输入)但同时我不会看我的正则表达式来匹配像asdfasdf20m这样的随机输入。这个应该被拒绝(不匹配)。

首先,我要删除用户可能使用的任何分隔符(它们的输入看起来像4h, 10m,这没关系):

input = input.replace(/[\s.,;_|#-]+/g, '');

然后我捕获每个部分,我使用?指示为可选:

var match = /^((\d+)d)?((\d+)h)?((\d+)m)?$/.exec(input);

当我只想要实际值时,捕捉包括字母在内的整个组是一种混乱,但我不能说如果没有用括号括起来那个簇是可选的吗?

然后,当捕获空组时,match中的值为undefined。是否有任何函数将undefined值默认为特定值?例如,0在这里会很方便。

input"4d, 20h, 55m"match结果为的示例:

["4d20h55m", "4d", "4", "20h", "20", "55m", "55", index: 0, input: "4d20h55m"]

我的主要问题是:

  • 如何将群组指定为可选群组,但避免捕捉?

  • 如何处理可能匹配的输入,例如abcdefg6d8m

  • 如何处理更改的订单?例如,用户可以输入20m 10h

当我问“如何处理x”时,我的意思是我希望能够拒绝这些比赛。

1 个答案:

答案 0 :(得分:0)

作为变体:

HTML:

<input type="text">
<button>Check</button>
<div id="res"></div>

JS:

var r = [];
document.querySelector('button').addEventListener('click', function(){
  var v = document.querySelector('input').value;
  v.replace(/(\d+d)|(\d+h)|(\d+m)/ig, replacer);
  document.querySelector('#res').innerText = r;
}, false);

function trim(s, mask) {
    while (~mask.indexOf(s[0])) {
        s = s.slice(1);
    }
    while (~mask.indexOf(s[s.length - 1])) {
        s = s.slice(0, -1);
    }
    return s;
}

function replacer(str){
  if(/d$/gi.test(str)){
    r[0] = str;
  }
  else if(/h$/gi.test(str)){
    r[1] = str;
  }
  else if(/m$/gi.test(str)){
    r[2] = str;
  }
  return trim(r.join(', '), ',');
}

请参阅here