我有一个位置搜索字段,需要允许城市和州或邮政编码。我有两个单独的正则表达式模式,每个模式分别工作,但我遇到了组合它们的问题。
这个是针对城市和州的;它会检查以确保至少有两个字母,然后是一个逗号,一个可选的空格,以及另外两个字母。效果很好。
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/
答案 0 :(得分:3)
我在哪里错了?
var patt1 = /((^[a-z]{2,},\s*[a-z]{2}$\i)|(^[0-9]{5}))/;
您已将不区分大小写的 - modifier移动到正则表达式中(使用反斜杠进行转义但无关紧要)。它将尝试在字符串结束后匹配i
字符: - )
似乎在第二种可能性中忽略了对5个数字的要求;如果小于5,它将返回false,但如果大于5,则返回true。
你再次忘记了anchor他们(至少到最后,你的组合尝试甚至将他们锚定在字符串开头)。
修正:
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");
}
答案 1 :(得分:1)
我知道这不是你问的问题,但我会把它作为两个单独的模式。虽然它们在同一文本框上工作,但它们有两个不同的用途。使维护更容易。
当你在一年内回到这种模式时,你能够自信而快速地调整它吗?你已经在努力了。
cityStatePattern = "xxx"
zipPattern = "yyy"
VS
//check for city, state or zipcode
fieldPatterno = "xxx|yyy"
我每次都会选择第一个选项。