0

我有一个位置搜索字段,需要允许城市和州或邮政编码。我有两个单独的正则表达式模式,每个模式都单独工作,但在组合它们时遇到问题。

这个是针对城市和州的;它检查以确保至少有两个字母,然后是一个逗号、一个可选的空格,以及另外两个字母。效果很好。

var str="abc, de";
var patt1 = /^[a-z]{2,},\s*[a-z]{2}$/i;
if(patt1.test(str)) {
    alert("true");
}
else {
    alert("false");
}

这个是邮政编码的。它会检查以确保正好有 5 个数字。也有效。

var str="01235";
var patt1 = /[0-9]{5}/;
if(patt1.test(str)) {
    alert("true");
}
else {
    alert("false");
}

我知道您可以使用括号和管道符号来匹配替代项;我在过去两次验证了两种不同的电话号码格式 - (xxx) xxx-xxxx 或 xxx-xxx-xxxx:

var pattern = /((^\([0-9]{3}\) [0-9]{3}[-]{1}[0-9]{4}$)|(^[0-9]{3}-[0-9]{3}[-]{1}[0-9]{4}$))/;

但是当我尝试使用我的城市/州和邮政编码检查时,它不起作用。如果我输入邮政编码,它会正确返回 true,但城市和州的任何和所有组合都会返回 false,即使在单独使用城市/州模式时它们正确返回 true。在第二种可能性中,它似乎忽略了恰好 5 个数字的要求;如果少于 5 个,它将返回 false,但如果超过 5 个,它将返回 true。我在哪里出错了?

var patt1 = /((^[a-z]{2,},\s*[a-z]{2}$\i)|(^[0-9]{5}))/;

我在这里有一个小提琴:http: //jsfiddle.net/EmmyS/fHkZU/

4

2 回答 2

3

我哪里错了?

var patt1 = /((^[a-z]{2,},\s*[a-z]{2}$\i)|(^[0-9]{5}))/;

您已将不区分大小写的-修饰符移动到正则表达式中(用反斜杠转义,但这没关系)。它会尝试i在字符串结束后匹配一个字符:-)

在第二种可能性中,它似乎忽略了恰好 5 个数字的要求;如果少于 5 个,它将返回 false,但如果超过 5 个,它将返回 true。

您再次忘记了锚定它们(至少到最后,您的组合尝试甚至将它们锚定到字符串开始)。

更正:

var patt1 = /(^[a-z]{2,},\s*[a-z]{2}$)|(^[0-9]{5}$)/i;
// or maybe easier:
var patt1 = /^([a-z]{2,},\s*[a-z]{2}|\d{5})$/i;

不过不确定在哪里需要捕获组。

请注意,不将两种模式组合成一个可怕的正则表达式可能更容易(和更简洁的代码),而只是测试它们并在 JS 中执行逻辑,比如

var str="…";
var patt1 = /^[a-z]{2,},\s*[a-z]{2}$/i, // city and state abbreviation
    patt2 = /^\d{5}$/; // or zip code
if(patt1.test(str) || patt2.test(str)) {
    alert("true");
} else {
    alert("false");
}
于 2013-07-19T19:07:09.240 回答
1

我知道这不是您所要求的,但我会将其保留为 2 个单独的模式。虽然它们在同一个文本框上工作,但它们有两个不同的目的。使其更易于维护。

当你在一年内恢复到这种模式时,你是否能够自信而快速地调整它?你已经在为此苦苦挣扎。

cityStatePattern = "xxx"
zipPattern = "yyy"

对比

//check for city, state or zipcode
fieldPatterno = "xxx|yyy"

我每次都会选择第一个选项。

于 2013-07-19T19:14:07.830 回答