c#-英国邮政编码中的正则表达式
我在寻找一个答案来解决我在c#中经常遇到的表达问题。我正在寻找一个特定的邮政编码格式匹配,遇到了问题。下面是我正在检查的正则表达式模式:c#-英国邮政编码中的正则表达式,c#,regex,C#,Regex,我在寻找一个答案来解决我在c#中经常遇到的表达问题。我正在寻找一个特定的邮政编码格式匹配,遇到了问题。下面是我正在检查的正则表达式模式: ([A-Z]{1})([0-9]{2})([0-9]{1})([A-Z]{2}) 所以,这是寻找一个字母的格式,两个数字,一个数字,两个字母 当我在RegexPlanet.com上测试时,它给了我一个匹配项,但当我在c#中检查时,它给出了一个不寻常的响应。当我输入测试邮政编码为A112BB时,当我输入A112BBCCCC时,它起作用了,这也带来了一个匹配项。
([A-Z]{1})([0-9]{2})([0-9]{1})([A-Z]{2})
所以,这是寻找一个字母的格式,两个数字,一个数字,两个字母
当我在RegexPlanet.com
上测试时,它给了我一个匹配项,但当我在c#中检查时,它给出了一个不寻常的响应。当我输入测试邮政编码为A112BB
时,当我输入A112BBCCCC
时,它起作用了,这也带来了一个匹配项。有人知道为什么c#在找到匹配后选择忽略最后的字符吗?正如我所说,在RegexPlanet.com
上的测试仪中输入A112BBCCCC
失败,并表示不匹配
谢谢,最后的字符已被忽略,因为没有开始/结束字符串的标记。这可能是您想要的:
^([A-Z]{1})([0-9]{2})([0-9]{1})([A-Z]{2})$
正则表达式匹配正在寻找与模式匹配的子字符串。除非明确标记行的开始/结束,否则它将与文本中的任何位置相匹配
实际上,我会写得更简单:
^([A-Z])(\d\d)(\d)([A-Z][A-Z])$
甚至
^[A-Z]\d{3}[A-Z]{2}$
然后只需使用
string.Substring()
方法即可获得零件。我认为这应该更快/更简单(尽管我认为这是一个偏好问题)。最后的字符被忽略,因为没有开始/结束字符串的标记。这可能是您想要的:
^([A-Z]{1})([0-9]{2})([0-9]{1})([A-Z]{2})$
正则表达式匹配正在寻找与模式匹配的子字符串。除非明确标记行的开始/结束,否则它将与文本中的任何位置相匹配
实际上,我会写得更简单:
^([A-Z])(\d\d)(\d)([A-Z][A-Z])$
甚至
^[A-Z]\d{3}[A-Z]{2}$
然后只需使用
string.Substring()
方法即可获得零件。我认为这应该更快/更简单(尽管我认为这是一个偏好的问题)。您的正则表达式并不像可能的那样精确
有关更多信息,请参阅
特别是,“地区”可以是多种多样的,最后的部分可能不包含字母CIKMOV
^([A-Z]{1,2})([0-9][0-9A-Z]?) ([0-9])([ABDEFGHJLNPQRSTUWXYZ]{2})$
您的正则表达式可能不够精确 有关更多信息,请参阅 特别是,“地区”可以是多种多样的,最后的部分可能不包含字母CIKMOV
^([A-Z]{1,2})([0-9][0-9A-Z]?) ([0-9])([ABDEFGHJLNPQRSTUWXYZ]{2})$
RegexPlanet.com是一个以Java为中心的站点,并且在默认状态下假设您将使用只匹配整个字符串的Java正则表达式方法 .Net(和大多数其他语言)没有将此作为单独的方法。为了只匹配特定字符串而不匹配其他内容,您需要向正则表达式中添加开始和结束锚(
^
和$
),因此它最终看起来像这样
顺便说一下,当我在这里的时候,我觉得我应该指出,你对英国邮政编码的表达还远远不够完整。您当前的正则表达式甚至无法与大多数邮政区匹配(例如SE1
,GU57
,SL0
,等等,更不用说像NW1A
这样的伦敦市中心代码了)
由于格式可能有很多变化,英国邮政编码的完整正则表达式模式是一个相当长的字符串。您可以在Wikipedia上找到一个很好的例子:RegexPlanet.com是一个以Java为中心的网站,并且在默认状态下假设您将使用一个只匹配整个字符串的Java正则表达式方法 .Net(和大多数其他语言)没有将此作为单独的方法。为了只匹配特定字符串而不匹配其他内容,您需要向正则表达式中添加开始和结束锚(
^
和$
),因此它最终看起来像这样
顺便说一下,当我在这里的时候,我觉得我应该指出,你对英国邮政编码的表达还远远不够完整。您当前的正则表达式甚至无法与大多数邮政区匹配(例如SE1
,GU57
,SL0
,等等,更不用说像NW1A
这样的伦敦市中心代码了)
由于格式可能有很多变化,英国邮政编码的完整正则表达式模式是一个相当长的字符串。你可以在维基百科上找到一个很好的例子:你可能会发现这很有用,它和英国邮政编码一样具体
static public bool IsPostCode (string postcode)
{
return (
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][0-9][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][0-9][0-9][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][A-HK-Ya-hk-y][0-9][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][A-HK-Ya-hk-y][0-9][0-9][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][0-9][A-HJKS-UWa-hjks-uw][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][A-HK-Ya-hk-y][0-9][A-Za-z][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[Gg][Ii][Rr][]*0[Aa][Aa]$)")
);
}
你可能会发现这很有用,它和英国邮政编码一样具体
static public bool IsPostCode (string postcode)
{
return (
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][0-9][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][0-9][0-9][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][A-HK-Ya-hk-y][0-9][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][A-HK-Ya-hk-y][0-9][0-9][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][0-9][A-HJKS-UWa-hjks-uw][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[A-PR-UWYZa-pr-uwyz][A-HK-Ya-hk-y][0-9][A-Za-z][ ]*[0-9][ABD-HJLNP-UW-Zabd-hjlnp-uw-z]{2}$)") ||
Regex.IsMatch(postcode, "(^[Gg][Ii][Rr][]*0[Aa][Aa]$)")
);
}
是的,这是一个很好的理由。实际上,我并没有试图验证邮政编码本身——这是在网站的其他地方完成的。英国邮政编码可以适用于6种变体中的任何一种(例如W1 1AA、WC1A 1AA等),我特别需要找出它适用于哪种变体。我最终会将邮政编码与6个正则表达式进行匹配,但到目前为止,我在c#中尝试过的那些正则表达式发现了与错误邮政编码的匹配,即使它们在该测试站点上工作。是的,这是有充分理由的。实际上,我并没有试图验证邮政编码本身——这是在网站的其他地方完成的。英国邮政编码可以适用于6种变体中的任何一种(例如W1 1AA、WC1A 1AA等),我特别需要找出它适用于哪种变体。我最终会将邮政编码与6个正则表达式进行匹配,但到目前为止,我在c#中尝试的那些正则表达式发现了与错误邮政编码的匹配,即使它们在该测试站点上工作。谢谢vilx-就是这样。没有开始和结束标记。干杯汉克斯·维尔克斯——就是这样。没有开始和结束标记。干杯,干杯,马克是问题所在。现在修好了。查看我对Daniel关于邮政编码格式的回答-我希望匹配特定的邮政编码格式Shi Spudley-干杯,标记是问题所在。现在修好了。查看我对Daniel关于邮政编码格式的回答-我希望匹配特定的邮政编码格式