我有一个ASP.NET / C#应用程序,它有一个表单字段,询问用户的位置,我们将其作为地理编码目的传递给Bing Maps。出于某种原因,我的客户希望将输入限制为这三种格式:
San Francisco, CA 91111
San Francisco, CA
91111
但是,我知道他们最终也会要求支持加拿大邮政编码。
当然,他们在项目启动前2小时要求这样做,所以我自己没有太多时间研究正则表达式并弄明白(我在正则表达式上很糟糕)所以我想我在这里问。
任何人都可以使用RegEx来验证它是否符合上述三种格式之一,同时支持加拿大邮政编码(不必支持ZIP + 4)。
答案 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}|$)))$