多个邮政编码部分的正则表达式

时间:2014-07-15 09:01:41

标签: php regex

我有匹配英国邮政编码第一部分的正则表达式:

/^[A-Z]{1,2}[0-9]{1,2}$/

但是我想允许多个这样的,所以需要检查以下条目:

BT5,BT6,BT9, BT43, BT21

即,用逗号或逗号和空格分隔的多个条目。

为了达到这个目的,我应该为正则表达式添加什么?

3 个答案:

答案 0 :(得分:2)

我假设不允许使用前导或尾随逗号,并且需要至少有一个条目。这给了你:

/^\s*[A-Z]{1,2}[0-9]{1,2}(?:\s*,\s*[A-Z]{1,2}[0-9]{1,2})*\s*$/

测试live on regex101.com

<强>解释

^         # Start of string
\s*       # Match optional whitespace
[A-Z]{1,2}[0-9]{1,2}   # Match one postcode
(?:       # Start of (repeated) noncapturing group:
 \s*,\s*  # Match a comma, optionally surrounded by whitespace
 [A-Z]{1,2}[0-9]{1,2}  # Match one postcode
)*        # Repeat as needed (including zero times)
\s*       # Match optional whitespace
$         # End of string

答案 1 :(得分:2)

像这样展开它(参见regex demo):

^[A-Z]{1,2}[0-9]{1,2}(?:, ?[A-Z]{1,2}[0-9]{1,2})*$
  • 在第一个邮政编码之后,非捕获组(?:, ?[A-Z]{1,2}[0-9]{1,2})*匹配零次或多次...
  • , ?带有可选空格的逗号......
  • 另一个邮政编码[A-Z]{1,2}[0-9]{1,2}

在PHP中:

$regex = '~^[A-Z]{1,2}[0-9]{1,2}(?:, ?[A-Z]{1,2}[0-9]{1,2})*$~';
if (preg_match($regex, $yourstring, $m)) {
    $thematch = $m[0];
    } 
else { // no match...
     }

答案 2 :(得分:0)

你可以实现一个像这样的正则表达式:

/[A-Z]{1,2}[0-9]{1,2}/

然后你可以使用:

preg_match_all("/[A-Z]{1,2}[0-9]{1,2}/", "BT5,BT6,BT9, BT43, BT21", $matches);

检索所有匹配的数组。

如果你想要一个只接受带有一些&#34;噪音的字符串的正则表达式&#34;在邮政编码之间,您可以尝试:

/^([A-Z]{1,2}[0-9]{1,2})(, ?([A-Z]{1,2}[0-9]{1,2}))*$/

使用[ ,]允许介于两者之间的字符列表(如空格和逗号)。