c#英国邮政编码分裂

时间:2009-07-23 14:21:29

标签: c# string

我需要一种从用户输入中分割英国邮政编码的方法。这意味着postocode可以很好地格式化完整代码,就像“AB1 1BA”或它可能是你能想象的任何东西。我已经看到一些正则表达式来检查邮政编码的格式,但是如果我给了“AB111AD”之类的东西,它就知道在哪里拆分它。 这是为了返回邮政编码的第一部分,在上面的例子中将是“AB11”。有什么想法吗?  感谢..

12 个答案:

答案 0 :(得分:17)

我过去曾写过类似的东西。我你可以在最后一位数之前拆分。 (例如,删除所有空格,找到最后一位数字,然后在其前面插入一个空格):

static readonly char[] Digits = "0123456789".ToCharArray();

...

string noSpaces = original.Replace(" ", "");
int lastDigit = noSpaces.LastIndexOfAny(Digits);
if (lastDigit == -1)
{
    throw new ArgumentException("No digits!");
}
string normalized = noSpaces.Insert(lastDigit, " ");

Wikipedia entry有很多细节,包括用于验证的正则表达式(在规范化之后:)

答案 1 :(得分:15)

我不确定英国邮政编码如何运作,最后一部分是否考虑了最后3个字符,第一部分是以前的所有内容?

如果是这样,假设你已经处理了适当的验证,那么这样的事情应该有效:(编辑感谢Jon Skeets的提交)

string postCode = "AB111AD".Replace(" ", "");
string firstPart = postCode.Substring(0, postCode.Length - 3);

这将返回邮政编码减去最后3个字符。

答案 2 :(得分:8)

  

英国邮政编码格式解释:

参考:http://www.mrs.org.uk/pdf/postcodeformat.pdf

POSTCODE FORMAT

邮政编码由以下元素组成: PO1 3AX

  • PO区域。英国有124个邮政编码区域
  • 1区。
  • 区域内约有20个邮政编码区
  • 3该部门。一个部门大约有3000个地址。
  • AX单位。每个单元大约有15个地址。

以下列表显示了所有有效的邮政编码格式。     " A"表示字母字符和" N"表示数字字符。

FORMAT EXAMPLE:

AN NAA - M1 1AA
ANN NAA - M60 1NW
AAN NAA - CR2 6XH
AANN NAA - DN55 1PT
ANA NAA - W1A 1HQ
AANA NAA - EC1A 1BB

请注意以下事项:

  • 字母Q,V和X未在第一个位置使用
  • 字母I,J和Z未在第二个位置使用。
  • 第三个位置出现的唯一字母是A,B,C,D,E,F,G,H,J,K,S,T,U和W.
  • 邮政编码的后半部分始终是一致的数字,字母,字母和字母C,I,K,M,O和 V从未使用过。

并且可以安全地假设space将是最后的第四个字符,即,如果邮政编码缺少空格,SW109RL,您可以盲目地在距离末尾的第4个位置放置一个空格SW10 9RL

答案 3 :(得分:0)

我曾与许多英国保险网站合作,我们通常会在不同的文本框中询问这两个部分。你如何验证地址?在某些网站中,我们一起询问邮政编码,但我们使用QAS来验证邮政编码并要求用户选择地址。即使邮政编码一起输入,QAS也可以验证。

答案 4 :(得分:0)

正则表达式可以通过为代码的每个部分使用命名组来帮助轻松解析英国邮政编码。正则表达式可以从这里获取:

http://www.regxlib.com/REDetails.aspx?regexp_id=260

或在这里:

http://www.mgbrown.com/PermaLink66.aspx



string ukPostCode = "AB1 1BA";
// Add group names in the pattern like this {FIRST_GROUP}    
string UK_POST_PATTERN = @"^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$";

Regex ukPostRegex = new Regex(UK_POST_PATTERN, RegexOptions.Compiled);

Match match = ukPostRegex.Match(ukPostCode);
if (match.Success)
{
    Group group = match.Groups["FIRST_GROUP"];
   // etc
}

答案 5 :(得分:0)

Brandon是正确的,您可以对最后3个字符进行子串,因为这是标准BS 7666定义的格式。因此“AA1 11AA”实际上不是有效的邮政编码。

显然,唯一违反BS 7666的是英国邮政邮局的邮政编码,它以BFPO开头并以4个数字结尾,例如: “BFPO 1234”。

Wikipedia entry有更多信息,以及验证的正则表达式。它还有一个选择引用:“只有通过尝试将邮件发送到地址才能进行完全准确的验证。”

答案 6 :(得分:0)

假设有效的输入字符串,例如一个通过以下正则表达式:

"^[A-Za-z]{1,2}[0-9Rr][0-9A-Za-z]?\s*?[0-9][ABDEFGHJLNPQRSTUWXYZabdefghjlnpqrstuwxyz]{2}$"

注意:这允许Outcode和Incode之间的可选空间。

然后下面的替换正则表达式将整理它 - (将它分成两个捕获$ 1和$ 2,然后插入空格):

postCode = Regex.Replace(postCode, "^(\S+?)\s*?(\d\w\w)$", "$1 $2")

答案 7 :(得分:0)

我已经编写了一种方法来尽我所能处理这个问题。

首先,我在文本框@maxlength="8"

上添加了最大长度

然后我在我的控制器中调用以下方法:

    if (searchString != null)
    {
        searchString = HtmlHelpers.ParseStringToUkPostcode(searchString);
    }      

该方法包括:

public static string ParseStringToUkPostcode(string inputPostcode)
        {
            string outputPostcode = inputPostcode;

            outputPostcode = outputPostcode.Replace(" ", "").Trim();
            string outward = outputPostcode.Substring(0, outputPostcode.Length - 3);
            string inward = outputPostcode.Substring(Math.Max(0, outputPostcode.Length - 3));
            string postcode = string.Format("{0} {1}", outward, inward);
            outputPostcode = postcode;

            return outputPostcode;
        }

它不漂亮,但它似乎相对强大,我需要的东西,并将处理用户提供的邮政编码的明显变化,至少在我的地区。

<强>声明

就这个应用而言,我不需要查看我县以外的邮政编码。

答案 8 :(得分:0)

我根据@Jon Skeet的建议编写了这个正则表达式,建议最后3个始终是数字字母

([a-zA-Z][a-zA-Z0-9]{1,3}) ?(\d[a-zA-Z]{2})

由于这部​​分[a-zA-Z0-9]{1,3},我可能会通过一些不好的事情,但是它对我来说足够好了。你can test it here

答案 9 :(得分:0)

  Simply split the string in equally section or as your requirements it may be single/double/triple bit



string postCode = "AB111AD".Replace(" ", "");
    string firstPart = postCode.Substring(0, postCode.Length - 3);
    string lastPart = postCode.Substring(postCode.Length -3,postCode.Length);

答案 10 :(得分:0)

我的PHP函数解决了这个问题....

function ParseStringToUkPostcode($inputPostcode)
{
    $outputPostcode = trim(str_replace(' ', '', $inputPostcode));
    $firstPart = substr($outputPostcode, 0,strlen($outputPostcode)-3);
    $lastPart = substr($outputPostcode,strlen($outputPostcode)-3);
    $outputPostcode = $firstPart.' '.$lastPart;
    return $outputPostcode;
}

答案 11 :(得分:0)

根据指南,英国邮政编码的第二部分始终以3个字符开头,并以数字开头,因此我抛出过多异常。您可以添加其他检查,例如; “如果大于8个字符”和“如果包含任何数字”。由你决定。

也请随时更改扩展名,我不喜欢它,因为它太长了。编码愉快!

邮政编码指南Guide to UK Postcodes

尝试以下代码:

将其添加为字符串扩展名,以便于使用。

使用此链接可以Create String Extensions

public static string FirstPartOfPostcode(this string str)
    {
        string postCodeNoSpaces = str.Replace(" ", "");

        char lastDigit = postCodeNoSpaces[postCodeNoSpaces.Length - 3];

        if(!Char.IsDigit(lastDigit))
        {
            throw new ArgumentException("Invalid PostCode");
        }

        string firstPart = postCodeNoSpaces.Substring(0, postCodeNoSpaces.Length - 3);

        return firstPart;
    }

使用:

string postcode = "AB111AD";
string firstPart = postcode.FirstPartOfPostcode();