Regex地址拆分需求:分组匹配规则适配及现有正则异常修复
正则解决方案
修正后正则表达式
支持大小写不敏感匹配,写法如下:
(?i)^(.+?)(?: (?=(?:.*east|.*west)$|(?<!^the |^))(street|road))?(?: (east|west))?$
如果使用的正则引擎不支持内联(?i)标记,可移除前缀的(?i),在正则外部添加不区分大小写的匹配标识即可,例如JavaScript场景写法为:
const addressReg = /^(.+?)(?: (?=(?:.*east|.*west)$|(?<!^the |^))(street|road))?(?: (east|west))?$/i
匹配逻辑说明
完全符合你提出的规则,同时解决了原有异常问题:
- 强制Group1始终非空,字符串以
the开头时前缀会保留在Group1中 - 仅当
street/road不是字符串全部内容、也不是仅跟在开头的the后面作为末尾内容时,才会被划入Group2,避免了the street、STREET这类场景的错误拆分 - Group3仅匹配字符串末尾的
east/west,如果方位词后还有其他内容则不会被单独拆分 - 拼写错误的道路类型(如
strreet、SttReet)不会被划入Group2,会保留在Group1中
测试用例匹配结果符合要求
所有你提供的测试用例匹配结果均符合预期:
| Text | Group 1 | Group 2 | Group 3 |
|---|---|---|---|
| smith | smith | ||
| the street | the street | ||
| STREET | STREET | ||
| the street west | the | street | west |
| smith street | smith | street | |
| smith road | smith | road | |
| smith strreet east | smith strreet | east | |
| SMITH | SMITH | ||
| SMITH Street | SMITH | Street | |
| SMITH Street | SMITH | Street | |
| Smith Street West abc | Smith Street West abc | ||
| Smith Street East | Smith | Street | East |
| Smith SttReet East | Smith SttReet | East | |
| Smith Street West | Smith | Street | West |
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

