PowerShell中加拿大地址正则表达式编写技术求助
优化加拿大地址匹配的PowerShell正则表达式
先聊聊你原来的正则存在的几个局限:
- 街道名称被限制成必须三个单词,但实际加拿大街道可能是2个词(比如
Main St)、4个词(比如King Street North West),甚至包含缩写或点号(比如St. Clair Ave) - 逗号的写法
[,]{1}+冗余且容易出错:{1}本来就是默认匹配一次,+会允许连续多个逗号,不符合正常地址格式 - 城市和省份部分只允许单个单词,但像
New Westminster这类带空格的城市名就匹配不了 - 没有考虑地址中可能存在的大小写混合(比如邮编小写也应该支持)
改进后的正则表达式
^(\d+)\s+([a-zA-Z.'\s]+),\s+([a-zA-Z\s'-]+),\s+([a-zA-Z\s'-]+),\s+([A-Za-z]\d[A-Za-z][ -]?\d[A-Za-z]\d)$
各部分详细解释
- 门牌号:
(\d+)- 匹配1位及以上的数字,如果你需要支持带字母后缀的门牌号(比如123A),可以改成(\d+[A-Za-z]?) - 街道名称:
([a-zA-Z.'\s]+)- 匹配包含字母、空格、点号、单引号的任意长度文本,覆盖大多数街道命名情况(比如Finch Ave East、St. John's Rd) - 分隔符与城市/省份:
,\s+- 匹配逗号加一个或多个空格(兼容地址中可能的空格差异);([a-zA-Z\s'-]+)允许城市/省份名称包含空格、连字符、单引号(比如Newfoundland and Labrador、Saint-Laurent) - 邮编:
([A-Za-z]\d[A-Za-z][ -]?\d[A-Za-z]\d)- 严格匹配加拿大邮编格式,允许中间有空格或无空格(比如A1A 1A1或A1A1A1),支持大小写字母
PowerShell中使用示例
你可以用-match操作符或者[regex]::Match()来测试:
$address = "1460 Finch Ave East, Toronto, Ontario, A1A1A1" $pattern = "^(\d+)\s+([a-zA-Z.'\s]+),\s+([a-zA-Z\s'-]+),\s+([a-zA-Z\s'-]+),\s+([A-Za-z]\d[A-Za-z][ -]?\d[A-Za-z]\d)$" if ($address -match $pattern) { Write-Host "门牌号: $($matches[1])" Write-Host "街道: $($matches[2])" Write-Host "城市: $($matches[3])" Write-Host "省份: $($matches[4])" Write-Host "邮编: $($matches[5])" }
额外说明
如果需要更宽松的匹配(比如允许地址部分顺序微调、省略省份等),可以进一步调整正则,但上面的版本已经能很好覆盖你给出的示例,以及大多数常见的加拿大地址格式。
内容的提问来源于stack exchange,提问作者user9545886
相关产品推荐
相关产品推荐

