用于验证city / state / zip的正则表达式

时间:2012-03-13 14:48:18

标签: c# regex

我有一个ASP.NET / C#应用程序,它有一个表单字段,询问用户的位置,我们将其作为地理编码目的传递给Bing Maps。出于某种原因,我的客户希望将输入限制为这三种格式:

San Francisco, CA 91111
San Francisco, CA
91111

但是,我知道他们最终也会要求支持加拿大邮政编码。

当然,他们在项目启动前2小时要求这样做,所以我自己没有太多时间研究正则表达式并弄明白(我在正则表达式上很糟糕)所以我想我在这里问。

任何人都可以使用RegEx来验证它是否符合上述三种格式之一,同时支持加拿大邮政编码(不必支持ZIP + 4)。

7 个答案:

答案 0 :(得分:11)

我尝试了这个,它似乎适用于你指定的所有情况:

var pattern =
    @"
    (^[\w\s]+,\s\w{2}$)|                        # City, State
    (^[\w\s]+,\s\w{2}\s\d{5}$)|                 # City, State and US PostCode
    (^[\w\s]+,\s\w{2}\s(\w\d\w\s?\d\w\d)$)|     # City, State and Canada PostCode
    (^\d{5}$)|                                  # US PostCode
    (^\w\d\w\s?\d\w\d$)                         # Canada PostCode";

使用此正则表达式时,请确保:

  • 指定RegexOptions.IgnorePatternWhitespace

  • 使用简明(不太可读)版本: (^[\w\s]+,\s\w{2}$)|(^[\w\s]+,\s\w{2}\s\d{5}$)|(^[\w\s]+,\s\w{2}\s(\w\d\w\s?\d\w\d)$)|(^\d{5}$)|(^\w\d\w\s?\d\w\d$)

答案 1 :(得分:2)

要匹配加拿大或美国邮政编码,您可以使用^\d{5}(-\d{4})?$)|(^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}$。由于在邮政编码存在时您并不真正需要城市和州,因此当正则表达式匹配时,您可以忽略其余的输入。因此,将该正则表达式放在捕获组中并提取它。例如:

Regex postalCodeRegex = new Regex("^.*(\d{5}(-\d{4})?$)|(^[ABCEGHJKLMNPRSTVXY]{1}\d{1}[A-Z]{1} *\d{1}[A-Z]{1}\d{1}).*$"
             , RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant);

Match m = postalCodeRegex.match(userInput);
if(m.Success) 
{
    String postalCode = m.Groups[1].Value;
    // Set location based on postal code
}
else 
{
    // Set location based on city
}

答案 2 :(得分:2)

假设C#使用PCRE:

匹配至少一个字母字符,并允许城市的空格和破折号

[A-Za-z\s\-]+

后跟一个逗号,一个双字符状态代码,

,\s?[A-Za-z]{2}

后跟一个空格和一个5位数字或6个字符的字符串。

\s(\d{5}|[A-Za-z0-9]{3}\s?[A-Za-z0-9]{3})

因此,对于第一个例子,结合一切。对于您的第二个示例,将第一个示例与第三个示例结合起来。删除最后一部分的前导\s

编辑:有时发现加拿大邮政编码中有空格。添加以支持该功能。

答案 3 :(得分:0)

不确定这是否是最好的正则表达式,但请尝试:

([\D]+)? ([\D]+)?([\d]+)?

编辑:

([\D]+)? ([\D]+)?([\d]+)?([\d\D]+){2}

答案 4 :(得分:0)

我不确定您要求的确切规格,但您可以使用这样的表达式来匹配示例中的格式字符串:

var re = @"(?xi)^\s*
    (?:
       [a-z][^,]+ , \s+ [a-z]{2}   
       (?: \s+ \d{5} )?            # optional postal code
    |
        \d{5}                      # postal code
    |
        [a-z]\d[a-z]\s*\d[a-z]\d   # canadian code
    )
    \s*$";

答案 5 :(得分:0)

行。我不是自己的正则表达式,我倾向于将问题分解为更小的正则表达式然后使用它们。

因此,城市和州将是:

([a-zA-Z ]+, [a-zA-z ]+)

美国邮政编码将是

(\d{5})

加拿大邮政编码将是:

([a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d)

因此邮政编码将是:

((\d{5})|([a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d))

完全放弃它们给我们:

(([a-zA-Z ]+, [a-zA-z]+) ((\d{5})|([a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d))?|((\d{5})|([a-zA-Z]\d[a-zA-Z] ?\d[a-zA-Z]\d)))

(城市和州后跟可选的ZIP或自己的ZIP)

我确信有更简单的方式来写信,但我正在等待工作完成,并认为我会把我的两个pennyworth放在

希望这个帮助

答案 6 :(得分:0)

这需要做很多工作,但这将验证大多数版本的城市州拉链和城市州。我们在生产中使用它来进行数百万的地址验证,因此非常可靠。

((?:\w|\s|\w\.)+),?\s(?i:AL|AK|AS|AZ|AR|CA|CO|CT|DE|DC|FM|FL|GA|GU|HI|ID|IL|IN|IA|KS|KY|LA|ME|MH|MD|MA|MI|MN|MS|MO|MT|NE|NV|NH|NJ|NM|NY|NC|ND|MP|OH|OK|OR|PW|PA|PR|RI|SC|SD|TN|TX|UT|VT|VI|VA|WA|WV|WI|WY|Alabama|Alaska|Arizona|Arkansas|California|Colorado|Connecticut|Delaware|District of Columbia|Florida|Georgia|Hawaii|Idaho|Illinois|Indiana|Iowa|Kansas|Kentucky|Louisiana|Maine|Maryland|Massachusetts|Michigan|Minnesota|Mississippi|Missouri|Montana|Nebraska|Nevada|New Hampshire|New Jersey|New Mexico|New York|North Carolina|North Dakota|Ohio|Oklahoma|Oregon|Pennsylvania|Rhode Island|South Carolina|South Dakota|Tennessee|Texas|Utah|Vermont|Virginia|Washington|West Virginia|Wisconsin|Wyoming)(|.(\d{5}(-\d{4}|\d{4}|$)))$