2011-04-28 83 views
1

我正在寻找一个在c#中的正则表达式问题的答案。我正在寻找特定邮编格式的匹配并遇到问题。下面是我检查的正则表达式:在c#中的正则表达式 - 英国邮政编码

([A-Z]{1})([0-9]{2})([0-9]{1})([A-Z]{2}) 

所以,这是寻找一个字母,两个数字,一个数字,两个字母的格式。

当我测试这个RegexPlanet.com是给了我一个匹配,但是当我在c#中检查它给了一个不寻常的响应。当它在A112BB的测试邮编中输入时,当我输入A112BBCCCC时,它也带回了一个匹配。任何人都知道为什么c#在匹配找到后选择忽略最后一个字符?正如我所说,输入A112BBCCCC进入测试仪RegexPlanet.com失败并表示不匹配。

感谢

回答

4

的最后一个字符都被忽略,因为没有标记的开始/结束的字符串。这可能是你想要什么:

^([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()方法来获取零部件。这应该是更快/更简单,我认为(尽管我认为这是一个偏好问题)。

+0

感谢vilx - 就是这样。没有开始和结束标记。干杯 – 2011-04-28 15:30:26

1

您的正则表达式不如其准确。

有关更多信息,请参阅here

特别是,“地区”可以是相当不同的,最后的组成部分可能不包含字母CIKMOV。

^([A-Z]{1,2})([0-9][0-9A-Z]?) ([0-9])([ABDEFGHJLNPQRSTUWXYZ]{2})$ 
+0

是的 - 有一个很好的理由。我其实并没有试图验证邮编本身 - 这是在网站上的其他地方完成的。英国邮政编码可以适应6种变体中的任何一种(例如W1 1AA,WC1A 1AA等),我特别需要找出它适合的变体。我最终将匹配邮编到6个正则表达式,但我迄今在c#中尝试过的那些匹配错误的邮编,尽管它们在该测试网站上工作。 – 2011-04-28 15:25:22

4

RegexPlanet.com是一个Java为中心的网站,并使得在默认状态下,假设你将使用其只匹配整个字符串的一个Java正则表达式的方法。

.Net(和大多数其他语言)没有将其作为单独的方法。为了只匹配一个特定的字符串而没有别的,你需要添加开始和结束锚(^$)到你的正则表达式,所以它最终看起来像这样^(......)$

顺便说一句,虽然我在这里,但我觉得我应该指出,你对英国邮政编码的表达远没有完成。您当前的正则表达式甚至不会符合大多数邮政区(如SE1GU57SL0,等等等等,更不用说伦敦市中心的代码一样NW1A

由于可能出现的变化,格式为数字,一个完整的正则表达式模式英国邮政编码是一个相当长的字符串。您可以在维基百科上找到它的一个很好的例子:http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom

+0

嗨Spudley - 欢呼声,标记是问题。现在修复。查看我对丹尼尔关于邮政编码格式的回答 - 我正在寻找匹配特定邮政编码格式 – 2011-04-28 15:32:41

8

,因为它得到了英国的邮政编码您可能会发现这个有用的,其对具体...

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]$)") 
     ); 
    } 
+0

哈哈 - 非常感谢 - – 2011-04-28 15:31:18

+0

愉快..... – 2011-04-28 15:31:58

相关问题