我需要一个正则表达式来匹配英国邮政编码的前半部分,并且可能只传递一半或完整的邮政编码。
这里有很好的方法来匹配完整的邮政编码:UK Postcode Regex (Comprehensive)
但是我需要获得邮政编码的前3或4个字符,可能会有半个邮政编码或没有空格的邮政编码,所以其中任何一个:
SL4 4BZ
SL44BZ - this will pull out just 'SL4'
SL4
DY10
DY10 3BD
DY10 3BD
正则表达式需要匹配:
但我无法理解如何编写这种复杂的东西。
答案 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个代码。我想有些规则也会改变。