【问题标题】:Get inward and outward codes from UK postal code从英国邮政编码获取进出代码
【发布时间】:2017-10-22 22:16:38
【问题描述】:

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

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


【解决方案1】:

只添加空格:

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

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

因此,如果您已经提取了代码,要添加空格或拆分,只需在倒数第三个字符之前添加一个空格,因为向内的代码长度总是 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])?))) 是第一个匹配 outward code 的捕获组,其长度可能为 2 到 4 个字符。
    • [A-PR-UWYZ],因为第一个字符不能有 QVX
    • (?:\d{1,2}|\d[A-HJ-KSTUW]) 允许使用ANANNANA 格式,并按照第三位的规则限制字符
    • (?:[A-HK-Y]\d(?:\d|[A-Z])?)) 允许AANAANNAANA 格式,并且不允许IJZ 在第二个位置
  • \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。
  • 邮政编码的后半部分始终是数字、字母、字母格式和字母 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);

【讨论】:

  • 太棒了。我不确定内向代码的长度。这现在完美无缺。非常感谢。
  • @samithagun 添加了一个 dotnet fiddle 演示以及对正则表达式的一些解释。如果答案有助于解决您的问题,您可能希望将其标记为已接受的答案。谢谢!
【解决方案2】:

试试这个。

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;
        }
    }
}

输出

希望它能解决你的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    相关资源
    最近更新 更多