5

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

可能的组合和匹配示例:

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

邮政编码中的空格只是为了清楚起见,它们可能存在也可能不存在,因此必须忽略。

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

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

UPDATE2:对不起,如果我之前不够清楚 - 我不需要验证邮政编码,我需要提取地区和地区代码。

UPDATE3:再次强调:必须忽略空格,它可能是AA99 9AAAA999AA- 在这两种情况下,正则表达式2(提取数)应该是99

UPDATE4:感谢您的所有回答,不幸的是,我刚刚发现 MySQL 无法提取正则表达式匹配项。走的路,MySQL,再次证明没用。

4

4 回答 4

5

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

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

并使用匹配组#1#2

于 2013-10-01T13:22:05.847 回答
2

这个正则表达式:

([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

如果我错过了一个不起作用的测试用例,请告诉我,我会看看我能做些什么

于 2013-10-01T14:30:37.180 回答
1

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

于 2013-10-01T13:19:43.520 回答
0

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

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

我已经为您所追求的第一部分和第二部分使用了捕获组。我假设您想要邮政编码第一部分中的号码。

于 2013-10-01T13:34:21.920 回答