我想只允许这种格式: 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;
}
答案 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])
示例:强>
这是一个有用的代码片段:
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;
这正是您所需要的。
<强>解释强>
[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}
匹配日期名称:它以大写字母开头,然后我们希望从4
到7
个字符,因为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])$/
//
^...$
说,从头到尾,匹配()
内的内容是一个群组,([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])
日期和月份。公开评论
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;