正则表达式 - 测试两种不同的模式

时间:2013-07-19 19:00:24

标签: javascript regex

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

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

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/

2 个答案:

答案 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"

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