Javascript 由逗号分隔的多个邮政编码

Javascript 由逗号分隔的多个邮政编码,javascript,regex,Javascript,Regex,我想在一个输入中过滤多个邮政编码,应该至少有两个邮政编码被一个COMA隔开,我正试图用下面的代码在javascript中验证它们,但现在它正在过滤,提交将表单发送到下一个页面没有错误,有人可以帮助吗 <script> function validateMULTIZIP() { if(!/\d{11,}/.test(document.zipad.textfield.value) && document.getElementById('single').check

我想在一个输入中过滤多个邮政编码,应该至少有两个邮政编码被一个COMA隔开,我正试图用下面的代码在javascript中验证它们,但现在它正在过滤,提交将表单发送到下一个页面没有错误,有人可以帮助吗

<script>
function validateMULTIZIP() {
    if(!/\d{11,}/.test(document.zipad.textfield.value) && document.getElementById('single').checked==false))
    {
         alert( "There should be a least two Zip codes separated by a coma." );
         document.zipad.textfield.focus() ;
         return false;
    }
    return true;
}
</script>

这将检查两个由逗号分隔的5位数字

^\d{5},\d{5}$
但是,你说至少有两个,这意味着它需要更灵活一点,以适应更多的需求。如果用户输入123451234512345,则它必须有效

^\d{5}(?:,\d{5})+$
如果用户在逗号后添加空格怎么办?比如12345,12345。这是完全有效的,所以让我们确保验证器允许这样做

^\d{5}(?:,\s*\d{5})+$
哦,邮政编码可以有一个可选的-1234结尾,也被称为。也许你想要这样的东西

^\d{5}(?:-\d{4})?(?:,\s*\d{5}(?:-\d{4})?)+$
现在这样的字符串是有效的

12345 12345, 12345,12345 12345, 12345-9999, 12345 另外,假设12345、12345是无效的,因为它有两次相同的邮政编码。下面是我们如何解决这个问题的

(?:(\d{5}),?)(?!.*\1)
这是ZIP+4版本

(?:(\d{5}(?:-\d{4})?),?)(?!.*\1(?!-))
由于可能出现诸如12345、12345-9999之类的问题,这一点增加了一点复杂性。这是有效的,但因为12345可以多次出现,它确保5位邮政编码不会被唯一的9位邮政编码失效

注意,这些重复检查正则表达式不强制执行至少两个唯一邮政编码。如果要检查重复项,则需要将两者结合起来

var valid5DigitZipCodes = function(str) {
  if (! /^\d{5}(?:,\s*\d{5})+$/.test(str)) {
    alert("You need at least 2 zip codes");
    return false;
  }

  else if (! /(?:(\d{5}),?)(?!.*\1)/.test(str)) {
    alert("You entered a duplicate zip code");
    return false;
  }

  return true;
};
如果你想支持的话,这里有一个ZIP+4变体

var valid9DigitZipCodes = function(str) {
  if (! /^\d{5}(?:-\d{4})?(?:,\s*\d{5}(?:-\d{4})?)+$/.test(str)) {
    alert("You need at least 2 zip codes");
    return false;
  }

  else if (! /(?:(\d{5}(?:-\d{4})?),?)(?!.*\1(?!-)).test(str) {
    alert("You entered a duplicate zip code");
    return false;
  }

  return true;
};

假设您的邮政编码包含五位数字,而不包含其他字符,您可以使用:

/\d{5},\d{5}/.test(document.zipad.textfield.value)

正则表达式:\d{11,}表示任意数字,11倍或更多,这就是它被破坏的原因。

另一种不使用正则表达式的解决方案是用逗号拆分邮政编码,然后检查结果数组的大小

示例代码:

<input type="text" id="in"></input>
<button onclick="validate()">Click</button>
JS


这里是一个工作JSFIDLE

,供任何对同样匹配1个或多个zip而不是两个或多个zip的变体感兴趣的人使用。只需更改表达式末尾*的+量词

发件人:

致:

例如:


谢谢工作很好,我很感激,保持良好的工作。很好的图表,你正在使用应用程序自动生成这些吗?
function validate() {
    var inp = document.getElementById("in");
    var content = inp.value;
    var correct = validateZipString(content);
    if (correct) {
        alert("ok");
    } else {
        alert("not ok");
    }
}

function validateZipString(zipString) {
    var zipCodes = zipString.split(',');
    if (zipCodes.length < 2) return false;
    for (var i = 0; i < zipCodes.length; i++) {
        //validate each zipCode if required
    }
    return true;
}
^\d{5}(?:-\d{4})?(?:,\s*\d{5}(?:-\d{4})?)+$
^\d{5}(?:-\d{4})?(?:,\s*\d{5}(?:-\d{4})?)*$