正则表达式匹配英国邮政编码的前半部分

时间:2014-10-21 18:01:28

标签: regex postal-code

我需要一个正则表达式来匹配英国邮政编码的前半部分,并且可能只传递一半或完整的邮政编码。

这里有很好的方法来匹配完整的邮政编码:UK Postcode Regex (Comprehensive)

但是我需要获得邮政编码的前3或4个字符,可能会有半个邮政编码或没有空格的邮政编码,所以其中任何一个:

SL4 4BZ
SL44BZ - this will pull out just 'SL4'
SL4
DY10
DY10 3BD
DY10 3BD

正则表达式需要匹配:

  • 如果长度为5个字符(不包括空格),请删除最后3个字符 字符和前两个字符是 半个邮政编码
  • 如果长度为6个字符(不包括空格),请删除最后3个字符 字符和前3个字符是 半个邮政编码
  • 如果长度为7个字符(不包括空格),请删除最后3个字符 字符和前4个字符是 半个邮政编码
  • 如果长度为2,3或4个字符,请保留

但我无法理解如何编写这种复杂的东西。

2 个答案:

答案 0 :(得分:1)

更新了以获得2/5个字符,总覆盖率= 2/5或3/6或4/7

这适用于输入样本 以下是同一件事的两种变体。

Capture group 1中的结果

 #  (?m)^([A-Z0-9]{2,4})(?:\s*[A-Z0-9]{3})?$

 (?m)
 ^ 
 (                             # (1 start)
      [A-Z0-9]{2,4} 
 )                             # (1 end)
 (?: \s* [A-Z0-9]{3} )?
 $ 

Capture group 0中的结果

 # (?m)^[A-Z0-9]{2,4}(?=(?:\s*[A-Z0-9]{3})?$)

 (?m)
 ^ 
 [A-Z0-9]{2,4} 
 (?=
      (?: \s* [A-Z0-9]{3} )?
      $ 
 )

@Smickie - 更新 - 关于JS中有关内联修饰符的问题。
(我不是JS专家,但这是一个简单的例子)
我不相信内联修饰符构造可用。但是,可以添加它们 通过flags参数(枚举)或/../flags表示法。

你可以在这里看到这个例子在JSfiddle工作 - > http://jsfiddle.net/cdcv8uug/

var teststr = "SL\nSL 4BZ\nSL4BZ\nSL4\nSL4 4BZ\nSL44BZ\nDY10\nDY10 3BD\nDY10 3BD";

var arr = teststr.match( /^[A-Z0-9]{2,4}(?=(?:\s*[A-Z0-9]{3})?$)/mg );

var res = "Using match() -> Capture group 0\nteststr.match(/^[A-Z0-9]{2,4}(?=(?:\s*[A-Z0-9]{3})?$)/mg)\n";
for (var index = 0; index < arr.length; index++)
{
   res += index + ":  " +  arr[index] + "\n";
}

var re = /^([A-Z0-9]{2,4})(?:\s*[A-Z0-9]{3})?$/mg;
res += "\nUsing exec() -> Capture group 1\nvar re = /^([A-Z0-9]{2,4})(?:\s*[A-Z0-9]{3})?$/mg;\nre.exec(teststr)\n";

index = 0;
while ((arr = re.exec(teststr)) != null)
{
    res += index + ":  " + arr[1] + "\n";
    index++;
}

alert( res );

答案 1 :(得分:0)

假设邮政编码代表整个字符串,请尝试

^[A-Z0-9]{3}([A-Z0-9](?=\s*[A-Z0-9]{3}|$))?

您可能需要设置不区分大小写的选项,并且应该在换行符处设置^ $ match

正则表达式匹配前三个字母或数字,然后匹配第四个字符(如果后面跟着另外三个字符),或者匹配行的末尾。

如果你想尝试验证邮政编码片段,那么正则表达式会更复杂。并且需要经常更新 - 维基百科表示每个月创建2,750个新代码,终止2,500个代码。我想有些规则也会改变。