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

Posted

技术标签:

【中文标题】正则表达式匹配英国邮政编码的前半部分【英文标题】:Regex to match the first half of a UK postcode 【发布时间】:2014-10-21 18:01:28 【问题描述】:

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

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

但是,我只需要获取邮政编码的前 3 或 4 个字符,并且有可能传入半个邮政编码或没有空格的邮政编码,所以这些中的任何一个:

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

正则表达式需要匹配:

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

但我无法完全理解如何编写如此复杂的东西。

【问题讨论】:

空格?在编写模式时它们似乎很重要,它们不算数,不是吗? SL 44BZT 呢? 用正则表达式来做这件事吗?您所描述的内容使用字符串操作将非常容易。 您实际上必须使用某种方法来区分 3 或 4 个邮政编码,而不是长度或空格。 ***.com/questions/21616133/… 【参考方案1】:

更新为 2/5 个字符,总覆盖率 = 2/5 或 3/6 或 4/7

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

捕获组 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 )?
 $ 

捕获组 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 表示法。

你可以在这里看到这个例子在 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 );

【讨论】:

这太棒了,但是...... '(?m)' 修饰符不适用于 javascript 的匹配,是否有可能使它适用? @Smickie - 回复:This is fantastic but... the '(?m)' modifier doesn't work with JavaScript's match, is it possible to make it work with that? – Smickie 4 hours ago 添加了更新。【参考方案2】:

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

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

你可能想设置不区分大小写的选项,你应该在换行符处设置 ^$ 匹配

正则表达式匹配前三个字母或数字,然后匹配第四个字符(如果后面有三个字符或行尾)。

如果您还想尝试验证邮政编码片段,则正则表达式会更复杂。并且需要经常更新——***指出每个月有 2,750 个新代码被创建,2,500 个被终止。我想一些规则也会改变。

【讨论】:

以上是关于正则表达式匹配英国邮政编码的前半部分的主要内容,如果未能解决你的问题,请参考以下文章

带有空格的英国邮政编码的Java正则表达式[重复]

英国邮政编码正则表达式验证

仅获取英国邮政编码的第一部分

使用正则表达式验证英国邮政编码

英国邮政编码的正则表达式

带空格的英国邮政编码正则表达式