我试图找到一种从用户条目中拆分英国邮政编码的方法。初始条目由以下正则表达式验证,并且工作正常。
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
答案 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]
,因为第一个字符不能包含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
第二位\s?
匹配向外和向内代码之间的可选空格。(\d[ABD-HJLNP-UW-Z]{2})
是外向代码的第二个捕获组。根据规则,它允许一个数字后跟两个字符。如果您的目标是仅匹配并添加空格,请使用上面的匹配并替换为$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)