验证月份的输入

时间:2015-09-30 13:49:11

标签: javascript string validation input

我想只允许这种格式: 19.30星期五2/10 。那么19:30而不是19.30也是可以接受的。怎么这么容易?请注意,也可以接受全新代码的答案。

这是我的尝试,但在月份部分失败了。 str是我们尝试验证的字符串。

var ok = true, index = - 1;
for(var i = 0; i < str.length; ++i) {
  if(i == 0 || i == 1 || i == 3 || i == 4) {
    if(!$.isNumeric(str[i])) {
      ok = false;
      break;
    }
  }
  if(i == 2) {
    if(str[i] != '.' && str[i] != ':') {
      ok = false;
      break;
    }
  }
  if(i == 5) {
    if(str[i] != ' ') {
      ok = false;
      break;
    } else {
      ++whitespaces;
    }
  }
  if(i > 5 && index == -1) {
    if(!isLetter(str[i])) {
      if(str[i] == ' ') {
        ++whitespaces;
        index = i;
      } else {
        ok = false;
        break;
      }
    }
  }
}
for(var i = index + 1; i < str.length; ++i) {
  if(i == index + 1 || i == index + 2 || i == index + 4) {
    if(!$.isNumeric(str[i])) {
      ok = false;
      break;
    }
  } else {
      if(str[i] != '.' && str[i] != '/') {
      ok = false;
      break;
  }
 }
}

if(!ok || whitespaces != 2) {
   alertify.error("Bad format, match creation failed!");
   return;
}

4 个答案:

答案 0 :(得分:2)

我真的怀疑用户使用这样的输入字段是否方便,即使你在现场有掩码,我说我看到了几种方法:

  • 使用正则表达式验证输入字段(最简单)

  • 使用任何输入框掩码插件(谷歌 - 有数百个)

  • (我更喜欢)使用日常和时间的正常控件(即html5日期etc,或jquery.ui日期和时间输入)并将javascript Date对象格式化为所需的日期/时间格式。

    < / LI>

另外,不要使用提示从用户那里获取数据,使用大量的javascript模式(jquery.ui,bootstrap等每个都有一个)

示例正则表达式:(\d\d?):(\d\d?)\s(\w+)\s(\d\d?)/(\d\d?)

将javascript日期对象格式化为您的格式(为简单起见,使用moment.js):

moment(myDate).format('hh:mm Do dd/MM')

另请查看插件的日期/时间输入,例如one

更新:为了澄清我的观点 - 我真的怀疑你的要求的全部原因只是以这种格式获取日期,你将使用日期来做某事,这就是为什么你更好开始将日期作为日期,而不是一些格式化以符合遗留要求的字符串。鉴于您最好使用便于输入Date的UI控件,即html5日期输入,或任何执行相同操作的插件。这将使您能够使用之后的日期,并在需要时将其格式化为所需的格式(例如,使用moment.js进行高级格式化)

答案 1 :(得分:1)

这是一个正则表达式解决方案,您只需要测试您的字符串是否与此正则表达式匹配:

<强>正则表达式:

[0-9]{2}[\.:][0-9]{2} [A-Z][a-z]{4,7} ([0-2][0-9]|[3][01])\/(0[1-9]|1[12])

示例:

这是一个有用的代码片段:

&#13;
&#13;
var str = "19.30 Friday 2/10";
var regex= /[0-9]{2}[\.:][0-9]{2} [A-Z][a-z]{4,7} [0-9]\/[0-9]{2}/
if (str.match(regex)) {
  alert("String matched .");
} else {
  alert("String unmatched !!");
}
&#13;
&#13;
&#13;

这正是您所需要的。

<强>解释

[0-9]{2}[\.:][0-9]{2} [A-Z][a-z]{4,7} [0-9]\/[0-9]{2}
  • [0-9]{2}匹配两位数。
  • [\.:]匹配.:,如yopu所述。
  • [0-9]{2}将匹配.:之后的第二部分(两位数)。
  • [A-Z][a-z]{4,7}匹配日期名称:它以大写字母开头,然后我们希望从47个字符,因为Friday是最短的Wednesday是最长的一个。
  • [0-9]\/[0-9]{2}匹配2/10的最后一部分。

答案 2 :(得分:1)

一个简单的例子

var re = /^[0-2][0-9](\.|:)[0-5][0-9] ([a-z]*) [0-9]{1,2}\/[0-9]{1,2}$/;
// the regex above checks 
// if the first number is a valid hour (between 00 and 24), then . or :,
// a valid minute number between 00 and 59,
// if you have a space, then a string, another space,
// then a valid month (0 - 12)

// How to use ?
var text = "19.30 Friday 2/10";
console.log(re.test(text)) // return true

答案 3 :(得分:1)

以下正则表达式适用于您:

如果2/10代表2月10日

/^([0-9]|1\d|2[0-3])[\.:]([0-9]|[1-5]\d)\s(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)\s([0-9]|1[0-2])\/([0-9]|[12]\d|3[01])$/

如果2/10代表10月2日

/^([0-9]|1\d|2[0-3])[\.:]([0-9]|[1-5]\d)\s(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)\s([0-9]|[12]\d|3[01])\/([0-9]|1[0-2])$/

RegEx说明:

  • JavaScript中的正则表达式介于//
  • 之间
  • ^...$说,从头到尾,匹配
  • 中给出的模式
  • ()内的内容是一个群组,([0-9]|1\d|2[0-3])匹配0 - 23。表达式匹配(0-9 OR starting with 1 and \d(any digit) OR a two digit number where 10th digit should be 2 and unit place should be between 0-3 inclusive
  • [\.:] - 下一个令牌可能是.:.需要转义,因为它是正则表达式中的元字符,可以匹配任何内容。
  • ([0-9]|[1-5]\d) - 你会知道这是什么,指的是第一点。
  • \s匹配单个空格
  • (Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)匹配
  • 中的任何给定模式
  • ([0-9]|1[0-2])\/([0-9]|[12]\d|3[01])日期和月份。
  

公开评论

&#13;
&#13;
var input = ["19.30 Friday 2/10",
             "19.60 Friday 2/10",
             "1.32 Friday 2/10",
             "10.30 Sunday 2/10",
             "22.30 Monday 2/10",
             "19:30 Saturday 12/10",
             "19.30 Friday 14/10",
             "19.30 Friday 2/21",
             "19:1 March 10/10"         
            ];

var output = "";
for(var i = 0; i < input.length; i++) {
    output += (input[i] + " " + /^([0-9]|1\d|2[0-3])[\.:]([0-9]|[1-5]\d)\s(Sunday|Monday|Tuesday|Wednesday|Thursday|Friday|Saturday)\s([0-9]|[12]\d|3[01])\/([0-9]|1[0-2])$/.test(input[i]) + "<br/>")
}

document.write(output);
&#13;
&#13;
&#13;