Javascript正则表达式,用于匹配范围两边的值的长度

时间:2013-10-13 02:24:20

标签: javascript regex validation

我正在尝试使用Javascript验证邮政编码范围,并且为该方法提供国家/地区特定验证规则的框架使用正则表达式。

有没有办法验证(使用正则表达式匹配/测试/任何其他js正则表达式函数)如果范围分隔符两边的字符数(在这种情况下它的冒号)是相同的?

e.g。 85001:85255A9A 9AA:A9A 9ZZ有效(双方都有相同数量的字符)

然而, 85001:255A9A 9AA:9ZZ无效(对于x:y,x与y的字符数不同)

由于

6 个答案:

答案 0 :(得分:2)

这是@ tak3r

提供的一些不那么冗长的RegEx版本
var r = /^(.{1}:.{1}|.{2}:.{2}|.{3}:.{3}|.{4}:.{4}|.{5}:.{5}|.{6}:.{6}|.{7}:.{7})$/

答案 1 :(得分:1)

正则表达式的一个范例是它们无法计算。

但是,如果您知道一侧字符数的最大长度,您可以像这样“破解”。假设最大长度为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);

答案 2 :(得分:0)

您可以简单地拆分标记并比较长度:

var range = "123:567";

var tokens = range.split(":");

var valid = tokens[0].length === tokens[1].length;

答案 3 :(得分:0)

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/

答案 4 :(得分:0)

您可以在冒号的两侧使用捕获括号,然后测试它们 平等的长度。

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!

答案 5 :(得分:0)

考虑到你的两个邮政编码,只是一个额外的想法:

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));