You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)$

各部分详细解释

  1. 门牌号:(\d+) - 匹配1位及以上的数字,如果你需要支持带字母后缀的门牌号(比如123A),可以改成(\d+[A-Za-z]?)
  2. 街道名称:([a-zA-Z.'\s]+) - 匹配包含字母、空格、点号、单引号的任意长度文本,覆盖大多数街道命名情况(比如Finch Ave East、St. John's Rd)
  3. 分隔符与城市/省份:,\s+ - 匹配逗号加一个或多个空格(兼容地址中可能的空格差异);([a-zA-Z\s'-]+) 允许城市/省份名称包含空格、连字符、单引号(比如Newfoundland and Labrador、Saint-Laurent)
  4. 邮编:([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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:39:33