【问题标题】: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 个邮政编码,而不是长度或空格。

标签: regex postal-code


【解决方案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 个被终止。我想一些规则也会改变。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多