我正在尝试使用 Javascript 验证邮政编码范围,并且为该方法提供国家特定验证规则的框架使用正则表达式。
有没有办法验证(使用正则表达式匹配/测试/任何其他 js 正则表达式函数)范围分隔符两侧的字符数(在这种情况下是冒号)是否相同?
例如
85001:85255
或A9A 9AA:A9A 9ZZ
有效(双方的字符数相同)
而
85001:255
orA9A 9AA:9ZZ
无效(x 与 y 中 x:y 的字符数不同)
谢谢
我正在尝试使用 Javascript 验证邮政编码范围,并且为该方法提供国家特定验证规则的框架使用正则表达式。
有没有办法验证(使用正则表达式匹配/测试/任何其他 js 正则表达式函数)范围分隔符两侧的字符数(在这种情况下是冒号)是否相同?
例如
85001:85255
或A9A 9AA:A9A 9ZZ
有效(双方的字符数相同)
而
85001:255
orA9A 9AA:9ZZ
无效(x 与 y 中 x:y 的字符数不同)
谢谢
这里是 @tak3r 提供的 RegExp 的稍微简洁的版本
var r = /^(.{1}:.{1}|.{2}:.{2}|.{3}:.{3}|.{4}:.{4}|.{5}:.{5}|.{6}:.{6}|.{7}:.{7})$/
正则表达式的一种范式是它们不能计数。
但是,如果您知道一边的字符数的最大长度,您可以像这样“破解它”。假设最大长度为 4:
var code = '8500:1234';
/\b((.:.)|(..:..)|(...:...)|(....:....))\b/.test(code)
如果您不想手动编写,可以像这样生成正则表达式:
var max_length = 6;
var delimiter = ':';
var regexp = [];
for (var i=1; i<=max_length; ++i) {
var side = '';
for (var j=1; j<=i; ++j) {
side += '.';
}
regexp.push('(' + side + delimiter + side + ')');
}
regexp = '\b(' + regexp.join('|') + ')\b';
regexp = new RegExp(regexp);
您可以简单地拆分令牌并比较长度:
var range = "123:567";
var tokens = range.split(":");
var valid = tokens[0].length === tokens[1].length;
function compareValues(str){
var str_array = str.split(':');
return (str_array[0].length===str_array[1].length);
}
alert(compareValues('A9A 9AA:A9A 9ZZ'));
alert(compareValues('85001:255'));
jsfiddle:http: //jsfiddle.net/EU7uB/4/
您可以在冒号两侧使用捕获括号,然后测试它们的长度是否相等。
var myString = "85001:85255";
var myRegexp = /^([\w][\w\s]+):([\w][\w\s]+)$/;
var match = myRegexp.exec(myString);
if (match[1].length === match[2].length) {
alert("There is a match!")
}
else {
alert("Not a match")
}
//There is a match!
考虑到您的两个邮政编码,只是一个额外的想法:
var s1 = "85001:85255";
var s2 = "A9A 9AA:A9A 9ZZ";
此正则表达式将测试冒号前后 5 位数字的模式,或 3 个字母或数字后跟一个空格,然后再测试冒号前后 3 个字母或数字的模式。
//var re = /(((\w|\d){3}\s(\w|\d){3}:(\w|\d){3}\s(\w|\d){3})|(\d{5}:\d{5}))/;
var re = /((\w{3}\s\w{3}:\w{3}\s\w{3})|(\d{5}:\d{5}))/;
alert(re.test(s1));
alert(re.test(s2));