正则表达式从英国邮政编码获取区域和地区代码

时间:2013-10-01 13:18:11

标签: mysql regex

基本上,我需要一个匹配英国邮政编码中的第一个字母序列(简单)的正则表达式和另一个匹配以下数字的正则表达式(不那么容易)。

可能的组合和匹配的示例:

AA9A 9AA    regex1: AA    regex2: 9
A9A 9AA     regex1: A     regex2: 9
A9 9AA      regex1: A     regex2: 9
A99 9AA     regex1: A     regex2: 99
AA9 9AA     regex1: AA    regex2: 9
AA99 9AA    regex1: AA    regex2: 99

poscodes中的空格只是为了清晰起见,它们可能存在也可能不存在,因此必须予以忽视。

我可以使用这两个正则表达式的一些帮助,尤其是regex2(匹配数字)。顺便说一下,我将在MySQL 5.6中运行它

更新:请注意:无论如何,最后3个字符将始终被忽略,这是唯一始终适用的模式 - 从我的示例中可以看到它。

UPDATE2:很抱歉,如果我之前不够清楚 - 我不需要验证邮政编码,我需要提取区号和区号。

UPDATE3:再次强调:必须忽略空格,可以是AA99 9AAAA999AA - 在这两种情况下,regex2(提取编号)都应该是{ {1}}

UPDATE4:感谢您的所有答案,遗憾的是我发现MySQL无法提取正则表达式匹配。要走的路,MySQL,再次被证明是无用的。

4 个答案:

答案 0 :(得分:3)

您可以使用此正则表达式:

([A-Z]+)([0-9]+).*?[A-Z0-9]{3}

并使用匹配的群组#1#2

答案 1 :(得分:1)

这个正则表达式:

([A-Z]+)([0-9]+)([A-Z ]*[0-9][A-Z]{2})

根据MySQL的POSIX ERE正则表达式实现的RegexBuddy 4模拟工作如下:

Input     G1   G2   G3
--------  ---  ---  ------
AA9A 9AA  AA   9    A 9AA
A9A 9AA   A    9    A 9AA
A9 9AA    A    9     9AA
A99 9AA   A    99    9AA
AA9 9AA   AA   9     9AA
AA99 9AA  AA   99    9AA
AA9A9AA   AA   9    A9AA
A9A9AA    A    9    A9AA
A99AA     A    9    9AA
A999AA    A    99   9AA
AA99AA    AA   9    9AA
AA999AA   AA   99   9AA

说明:

([A-Z]+)    # captures one or more letters
([0-9]+)    # captures one or more digits
(           # starts 3rd capture group
 [A-Z ]*    # captures zero or more letters or space
 [0-9]      # captures exactly one digit
 [A-Z]{2}   # captures exactly two letters
)           # ends 3rd capture group

如果我错过了一个无效的测试用例,请告诉我,我会看到我能做什么

答案 2 :(得分:0)

"[A-Z](?:\\D\\d\\D|\\d\\D|\\d|\\d{2}|\\D\\d|\\D\\d\\d|EI)\\s??\\d{1}\\D{2}" 对我来说效果很好。 这有点复杂,因为我用它从ONE LINE ADDRESS获取邮政编码(整个地址包含城市,国家,街道名称等,用于验证邮政编码)。 我在我的生产环境中使用它。

答案 3 :(得分:0)

我认为这可以满足您的需求:

([A-Z]{1,2})(\d+)[A-Z]?\s?\d+[A-Z]{1,2}

我已经将捕获组用于你所追求的第一和第二部分。我假设您想要邮政编码第一部分中的数字。