1

我有一个正则表达式来检查字符串是否为邮政编码。但我真的很希望能够从完整地址(或者,如果可能的话,任何字符串)中提取它。

这是我当前的正则表达式:

/^((\d{5}-\d{4})|(\d{5})|([a-zA-Z]\d[a-zA-Z]\s\d[a-zA-Z]\d)|([a-zA-Z]\d[a-zA-Z]\d[a-zA-Z]\d))$/

如有必要,我愿意接受一个函数(我正在使用 PHP 进行检查),但如果可能的话,我宁愿使用正则表达式来完成这项工作。

4

3 回答 3

2

PHP 会将分组提取()到一个数组中preg_match()

$matches = array();
$pattern = "/^((\d{5}-\d{4})|(\d{5})|([a-zA-Z]\d[a-zA-Z]\s\d[a-zA-Z]\d)|([a-zA-Z]\d[a-zA-Z]\d[a-zA-Z]\d))$/";
preg_match($pattern, $your_source, $matches);
print_r($matches);
于 2011-10-27T19:15:07.473 回答
2

preg_match,我假设您在根据正则表达式检查字符串时已经在使用它,它还会为您返回与您的模式匹配的实际文本。

preg_match($regex, $input, $matches);
echo $matches[0];

第三个参数填充了尝试将正则表达式与您的输入相匹配的结果。$matches[0]将包含与整个模式匹配的文本,而更高的索引将包含与捕获子模式(括号中的模式部分)匹配的文本。

但是,在您的情况下,您已经用输入开始和输入^结束$字符包围了您的模式,这意味着任何匹配都必须包括整个输入字符串(或多行模式下的整行)。在尝试使用此模式从较大的字符串中提取邮政编码之前,您必须摆脱^and 。$

于 2011-10-27T19:20:00.393 回答
0

既然您使用的是完整地址,为什么不依赖可以准确提取和验证地址并解析其组件(包括完整邮政编码)并提供良好响应的服务呢?它肯定会消除任何猜测。下面的屏幕截图显示了 SmartyStreets 的一个工具,它可以从各种文本中提取地址。为了全面披露,我是SmartyStreets的一名软件开发人员。

https://smartystreets.com/account/extract

实时地址提取

于 2012-01-12T15:23:48.657 回答