正则表达式匹配英国邮政编码的前半部分
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 个被终止。我想一些规则也会改变。
【讨论】:
以上是关于正则表达式匹配英国邮政编码的前半部分的主要内容,如果未能解决你的问题,请参考以下文章