我有一个正则表达式,用于检查字符串是否为邮政编码或邮政编码。但我真的希望能够从完整地址(或者,如果可能的话,任何字符串)中提取它。
这是我目前的正则表达式:
/^((\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检查),但是如果可能的话,我宁愿使用正则表达式来完成工作。
答案 0 :(得分: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);
答案 1 :(得分:2)
preg_match
,我假设您在使用正则表达式检查字符串时已经在使用,还会返回与您的模式匹配的实际文本。
preg_match($regex, $input, $matches);
echo $matches[0];
第三个参数填充了尝试将正则表达式与输入匹配的结果。 $matches[0]
将包含与整个模式匹配的文本,而较高的索引将包含与捕获子模式匹配的文本(括在括号中的模式部分)。
但是,在您的情况下,您已使用输入开始^
和输入结束$
字符包含模式,这意味着任何匹配都必须包含整个输入字符串(或多行模式下的整行)。在尝试使用此模式从较大的字符串中提取邮政编码之前,您必须删除^
和$
。
答案 2 :(得分:0)
由于您使用的是完整地址,为什么不依赖可以准确提取和验证地址并解析其组件(包括完整的邮政编码)的服务,从而提供良好的响应?它肯定会消除任何猜测。下面的屏幕截图显示了SmartyStreets的一个工具,它可以从各种文本中提取地址。为了完全披露,我是SmartyStreets的软件开发人员。
https://smartystreets.com/account/extract