我正在尝试从用户输入中提取一些应遵循以下格式的数据: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”时,我的意思是我希望能够拒绝这些比赛。
答案 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。