从英国邮政编码获取内向和外向代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从英国邮政编码获取内向和外向代码相关的知识,希望对你有一定的参考价值。
我正试图找到一种从用户条目中分割英国邮政编码的方法。初始条目由以下正则表达式验证,并且工作正常。
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
答案
只添加空格:
根据英国邮政编码的外向和内向代码的wikipedia entry,规则如下:
- 向外代码长度在2到4个字符之间
- 向内代码长度为三个字符
因此,如果您已经提取了代码,添加空格或拆分,只需在结尾的第3个字符之前添加一个空格,因为向内代码的长度始终为3个字符:
string extractedCode = "DD81UN";
extractedCode = extractedCode.Insert(extractedCode.Length - 3, " ");
// Output: DD8 1UN
改进正则表达式:
基于您分享的link中的规则,这里是正则表达式的更好版本,它从任何文本中提取英国邮政编码,即使它们包含空格:
([A-PR-UWYZ](?:(?:d{1,2}|d[A-HJ-KSTUW])|(?:[A-HK-Y]d(?:d|[A-Z])?)))s?(d[ABD-HJLNP-UW-Z]{2})
在开始和结束时表示单词边界
([A-PR-UWYZ](?:(?:d{1,2}|d[A-HJ-KSTUW])|(?:[A-HK-Y]d(?:d|[A-Z])?)))
是第一个匹配外部代码的捕获组,其长度可能是2到4个字符。[A-PR-UWYZ]
,因为第一个角色不能有Q
,V
或X
(?:d{1,2}|d[A-HJ-KSTUW])
允许格式AN
,ANN
和ANA
并根据第三个位置的规则限制字符(?:[A-HK-Y]d(?:d|[A-Z])?))
允许格式AAN
,AANN
和AANA
并且不允许I
,J
和Z
在第2位s?
匹配向外和向内代码之间的可选空格。(d[ABD-HJLNP-UW-Z]{2})
是第二个外向代码捕获组。根据规则,它允许一个数字后跟两个字符。
- 字母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(@"([A-PR-UWYZ](?:(?:d{1,2}|d[A-HJ-KSTUW])|(?:[A-HK-Y]d(?:d|[A-Z])?)))s?(d[ABD-HJLNP-UW-Z]{2})");
// To add spaces between each codes
string output = r.Replace(input, "$1 $2");
// To get all codes
var results = r.Matches(output);
另一答案
试试这个。
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
希望它能解决你的问题
以上是关于从英国邮政编码获取内向和外向代码的主要内容,如果未能解决你的问题,请参考以下文章
SAP 公司间STO场景中外向交货单过账后自动触发内向交货单功能的实现
软件开发解惑系列之五:内向性格不爱说话的同学,没有合适的工作方法是不行的