正则表达式在c# - uk邮政编码中

时间:2011-04-28 15:10:14

标签: c# regex

我正在寻找c#中常规表达问题的答案。我正在寻找特定邮政编码格式的匹配,并遇到了问题。这是我正在检查的正则表达式模式:

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

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

当我在RegexPlanet.com上测试时给了我一个匹配,但是当我在c#中检查时,它给出了一个不寻常的回应。虽然它在输入A112BB的测试邮政编码时起作用,但当我输入A112BBCCCC时,这也带来了匹配。有人知道为什么c#选择忽略匹配后的最后一个字符?正如我所说,在A112BBCCCC上向RegexPlanet.com输入{{1}}失败并且说不匹配。

由于

4 个答案:

答案 0 :(得分: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]$)")
        );
    }

答案 1 :(得分: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()方法获取部件。我认为这应该更快/更简单(尽管我认为这是一个偏好问题)。

答案 2 :(得分:4)

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

.Net(以及大多数其他语言)没有将此作为单独的方法。为了只匹配特定字符串而不是其他内容,您需要将开始和结束锚点^$)添加到正则表达式中,因此最终看起来像^(......)$

顺便说一下,当我在这里的时候,我觉得我应该指出你对英国邮政编码的表达远未完成。您当前的正则表达式甚至不会匹配大多数邮政地区(例如SE1GU57SL0等等,更不用说伦敦中心代码,例如NW1A

由于格式可能存在多种变化,因此英国邮政编码的完整正则表达式模式非常长。你可以在维基百科上找到一个很好的例子:http://en.wikipedia.org/wiki/Postcodes_in_the_United_Kingdom

答案 3 :(得分:1)

你的正则表达式不像它那样准确。

有关详细信息,请参阅here

特别是,“地区”可能会有很大变化,最终部分可能不包含字母CIKMOV。

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