我有一个像这样的变量
var time = "12h 55m";
我只允许在字符串中使用H,h,M,m
个字符。如果我有这样的东西
var time = "12hk 55m";
那么它应该产生错误。如何使用正则表达式验证这一点。'
寻找类似的东西
if (stringToTest.match(/^[a-zA-Z0-9]*$/))
答案 0 :(得分:2)
尝试
/^\d{1,2}[hm]\s+\d{1,2}[hm]$/i
匹配 2位,后跟 h 或m
,然后是一个或多个空格,然后是 2位,然后是 h 或 m
以下将匹配
"12h 55m".match(/^\d{1,2}[hm]\s+\d{1,2}[hm]$/i)
"12m 55h".match(/^\d{1,2}[hm]\s+\d{1,2}[hm]$/i)
"2m 55h".match(/^\d{1,2}[hm]\s+\d{1,2}[hm]$/i)
"12m 5h".match(/^\d{1,2}[hm]\s+\d{1,2}[hm]$/i)
这些不会
"122h 555m".match(/^\d{1,2}[hm]\s+\d{1,2}[hm]$/i)
答案 1 :(得分:0)
正则表达式中的 reg 代表常规,您的数据似乎有可能不规律。我建议以不同方式进行检查,但因为您正在寻找正则表达式解决方案:
/^(\d{2,3}h\s+\d{1,2}m)|(\d{1,2}m\s+\d{2,3}h)$/gi
这将按任意顺序匹配h
和m
,但如果两次都在字符串中,则会拒绝。
答案 2 :(得分:0)
您可以使用以下正则表达式^\d{1,2}[hmHM]\s\d{1,2}[hmHM]
:
^
在字符串\d
匹配一个数字(等于[0-9]){1,2}
量词 - 匹配1到2次,尽可能多次,根据需要回馈[hmHM]
匹配列表hmHM(区分大小写)\s
匹配任何空格字符\d{1,2}[hmHM]
如上所述\g
修饰符:全局。所有比赛(首场比赛后不返回)请参阅以下代码段进行测试:
var regex = /^\d{1,2}[hmHM]\s\d{1,2}[hmHM]/g;
function check(par){
console.log(par.value + " match: " + regex.test(par.value));
}

Insert a text in the input <input type="text" id="test" value="" onchange="javascript:check(this)">
&#13;
答案 3 :(得分:0)
接受的答案显然满足了OP。但是我注意到在this comment中,OP说不应该重复字符符号。例如,12h 12h
应该无效,但所有答案都与此匹配。我不认为这只能使用正则表达式来完成。所以这是另一种解决方案:
function timeParser(timeStr) {
var acChars = ['h', 'H', 'm', 'M'];
if ((timeStr.match(/\s/g) || []).length !== 1) return false;
var tokens = timeStr.split(' ');
for (var token of tokens) {
var rx = new RegExp("\\d{1,3}[" + acChars.join("") + "]", "g");
if (!token.match(rx) ||
token.match(rx).length !== 1 ||
token !== token.match(rx)[0]) return false;
var tc = token.charAt(token.length - 1);
acChars.splice(acChars.indexOf(tc), 1);
}
return true;
}
var timearr = ["12h 12h", "1m1h 515M", "12hk 55m", "H 12m", "m 12H", "12H 11m", "00m 001h", "20M 1"];
for (var tim of timearr)
console.log(timeParser(tim));
&#13;
和12h 12h
不匹配。