从a到z的正则表达式验证,但某些字符除外

时间:2017-04-19 06:13:34

标签: javascript regex

我有一个像这样的变量

var time = "12h 55m";

我只允许在字符串中使用H,h,M,m个字符。如果我有这样的东西

var time = "12hk 55m";

那么它应该产生错误。如何使用正则表达式验证这一点。'

寻找类似的东西

if (stringToTest.match(/^[a-zA-Z0-9]*$/))

4 个答案:

答案 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

这将按任意顺序匹配hm,但如果两次都在字符串中,则会拒绝。

答案 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;
&#13;
&#13;

答案 3 :(得分:0)

接受的答案显然满足了OP。但是我注意到在this comment中,OP说不应该重复字符符号。例如,12h 12h应该无效,但所有答案都与此匹配。我不认为这只能使用正则表达式来完成。所以这是另一种解决方案:

&#13;
&#13;
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;
&#13;
&#13;

12h 12h不匹配。