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

时间:2017-05-23 05:46:22

标签: c# regex validation

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

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

2 个答案:

答案 0 :(得分:2)

仅添加空格:

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

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

因此,如果您已经提取了代码,添加空格或拆分,只需在结尾的第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第二位
  • \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);

答案 1 :(得分:1)

试试这个。

var data = fs.readFileSync(searchTermsFile);
var searchTerms = JSON.parse(data);
var i = 0;
searchTerms = searchTerms.List;for(var j=0;j<searchTerms.length;j++)
{
 i = j
 console.log((searchTerms[i] || {}).Term);
 i +=1;
 console.log((searchTerms[i] || {}).Term); 
}

输出

enter image description here

希望它能解决你的问题