从英国邮政编码获取内向和外向代码

问题描述 投票:1回答:2

我正试图找到一种从用户条目中分割英国邮政编码的方法。初始条目由以下正则表达式验证,并且工作正常。

var regex = @"^([Gg][Ii][Rr] 0[Aa]{2})|((([A-Za-z][0-9]{1,2})|(([A-Za-z][A-Ha-hJ-Yj-y][0-9]{1,2})|(([AZa-z][0-9][A-Za-z])|([A-Za-z][A-Ha-hJ-Yj-y][0-9]?[A-Za-z]))))[0-9][A-Za-z]{2})$";

现在我需要将邮政编码拆分为向外和向内代码,以便我可以将它们单独发送到客户的ERP以获得运费。

例。

用户输入:DD81UN 期望的输出:DD8 1UN

用户输入:DN551PT 所需输出:DN55 1PT

c# regex validation
2个回答
2
投票

只添加空格:

根据英国邮政编码的外向和内向代码的wikipedia entry,规则如下:

  • 向外代码长度在2到4个字符之间
  • 向内代码长度为三个字符

因此,如果您已经提取了代码,添加空格或拆分,只需在结尾的第3个字符之前添加一个空格,因为向内代码的长度始终为3个字符:

string extractedCode = "DD81UN";
extractedCode = extractedCode.Insert(extractedCode.Length - 3, " ");
// Output: DD8 1UN

改进正则表达式:

基于您分享的link中的规则,这里是正则表达式的更好版本,它从任何文本中提取英国邮政编码,即使它们包含空格:

\b([A-PR-UWYZ](?:(?:\d{1,2}|\d[A-HJ-KSTUW])|(?:[A-HK-Y]\d(?:\d|[A-Z])?)))\s?(\d[ABD-HJLNP-UW-Z]{2})\b
  • \b在开始和结束时表示单词边界
  • ([A-PR-UWYZ](?:(?:\d{1,2}|\d[A-HJ-KSTUW])|(?:[A-HK-Y]\d(?:\d|[A-Z])?)))是第一个匹配外部代码的捕获组,其长度可能是2到4个字符。 [A-PR-UWYZ],因为第一个角色不能有QVX (?:\d{1,2}|\d[A-HJ-KSTUW])允许格式ANANNANA并根据第三个位置的规则限制字符 (?:[A-HK-Y]\d(?:\d|[A-Z])?))允许格式AANAANNAANA并且不允许IJZ在第2位
  • \s?匹配向外和向内代码之间的可选空格。
  • (\d[ABD-HJLNP-UW-Z]{2})是第二个外向代码捕获组。根据规则,它允许一个数字后跟两个字符。

Regex101 Demo

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

如果您的目标是仅匹配并添加空格,请使用上面的匹配并替换为$1 $2,因为上面的正则表达式匹配第一组中的外向代码和第二组中的内向代码。

这是一个dotnet fiddle,展示了相同的。

string input = "sample DD81UN DN55 1PT WRONG text 123456";
Regex r = new Regex(@"\b([A-PR-UWYZ](?:(?:\d{1,2}|\d[A-HJ-KSTUW])|(?:[A-HK-Y]\d(?:\d|[A-Z])?)))\s?(\d[ABD-HJLNP-UW-Z]{2})\b");

// To add spaces between each codes
string output = r.Replace(input, "$1 $2");

// To get all codes
var results = r.Matches(output);

1
投票

试试这个。

namespace UKPostCodeConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string firstPostCode = "DD81UN";
            string secondPostCode = "DN551PT";
            Console.WriteLine(ParseToUkPostcode(firstPostCode));
            Console.WriteLine(ParseToUkPostcode(secondPostCode));
            Console.Read();
        }
        public static string ParseToUkPostcode(string aPostcode)
        {
            string finalPostcode = aPostcode;

            finalPostcode = finalPostcode.Replace(" ", "").Trim();
            string outWardResult = finalPostcode.Substring(0, finalPostcode.Length - 3);
            string inWardResult = finalPostcode.Substring(Math.Max(0, finalPostcode.Length - 3));
            string postCodeResult = string.Format("{0} {1}", outWardResult, inWardResult);
            finalPostcode = postCodeResult;

            return finalPostcode;
        }
    }
}

OUTPUT

enter image description here

希望它能解决你的问题

© www.soinside.com 2019 - 2024. All rights reserved.