Regex 用于从加拿大地址提取省的正则表达式?

Regex 用于从加拿大地址提取省的正则表达式?,regex,Regex,我获取地址的来源不一致,有三种不同的方式 加拿大魁北克省莱维斯司令街100号 加拿大魁北克省莱维斯司令街100号G6V7N5 加拿大魁北克省莱维斯司令街100号G6V 7N5 第一个地址和街道部分的长度总是不同的。“加拿大”为找到该省提供了一个很好的锚,但挑战是邮政编码有时被分成2个,有时合并,有时不在那里 我有一个解决方案,但我正在寻找一个更好的。我的解决方案是在加拿大之前提取前三个术语 RegExExtract Address (\S+)\h(\S+)\h(\S+)\h+Canada 然后

我获取地址的来源不一致,有三种不同的方式

加拿大魁北克省莱维斯司令街100号

加拿大魁北克省莱维斯司令街100号G6V7N5

加拿大魁北克省莱维斯司令街100号G6V 7N5

第一个地址和街道部分的长度总是不同的。“加拿大”为找到该省提供了一个很好的锚,但挑战是邮政编码有时被分成2个,有时合并,有时不在那里

我有一个解决方案,但我正在寻找一个更好的。我的解决方案是在加拿大之前提取前三个术语

RegExExtract Address (\S+)\h(\S+)\h(\S+)\h+Canada
然后分析每个短语,看它是否有数字

RegExtract Phrase 1 (\d)  
   If RegEx Fails, Phrase 1 = Territory  
   If Success, RegExtract Phrase 2 (\d)  
       If RegEx Fails, Phrase 2 = Territory  
       If Success, RegExract Phrase 3 (\d)  
           If RegEx Fails, Phrase 3 = Territory    
           If Success, "Something went wrong"
这很好,但我想有更好的方法

也许

(?i)(\S+)\h*(?:G[A-Z0-9]+\h?[A-Z0-9]+)?\h+Canada
可能有点接近,但更好的选择可能是在捕获或非捕获组中简单列出这些状态,例如:

(?i)(Québec|Ontario|British Columbia|Montreal|Victoria|Saskatchewan|Calgary|Newfoundland|Nova Scotia|Alberta)(?:\h+)?(G[A-Z0-9]+)?(?:\h+)?([A-Z0-9]+)?\h+Canada$

“不列颠哥伦比亚”、“新斯科舍省”或“纽芬兰和拉布拉多”怎么样?我想既然只有10个省,最好不要使用正则表达式,或者只是交替地在正则表达式模式中硬编码所有的省名。没关系,我可以使用数组和更多的正则表达式,稍后将拉布拉多变成纽芬兰和拉布拉多,从哥伦比亚到不列颠哥伦比亚等,基本上相当于excel中的Vlookup。如果我错了,请纠正我,但我认为你的建议的问题是,每个省都会有以不同省份命名的道路和街道。也就是说,不列颠哥伦比亚省可能有一个安大略圣城。这是我考虑的另一个问题,也是一个很好的观点。将这两种方法结合起来,或将所有方法匹配起来,并在“加拿大”之前采用最后一种方法,可能有助于解决问题,但问题的关键在于,这个问题并非无关紧要,我认为可能的文本案例的范围可以进一步加以修饰,以避免武断的回答。