JavaScript正则表达式字符串分割问题:从含市政缩写的地址字符串中提取街道与门牌号
解决比利时地址字符串的正则提取问题
你的问题核心是原正则的字符类没有包含括号字符,导致遇到(Ide)这类市政缩写时,无法匹配完整的街道相关部分,最终整个正则匹配失败。我们可以针对性调整正则来解决这个问题。
分析原正则的问题
你的原正则:
/^(\d*[\p{L} \d'\/\\\-\.]+)[,\s]+(\d+)\s*([\p{L} \d\-\/'"\(\)]*)$/iu
第一捕获组的字符类[\p{L} \d'\/\\\-\.]里没有包含(和),所以当地址字符串里出现(Ide)时,正则匹配到Driesstraat就会停止,后面的(不在允许的字符范围内,导致后续的[,\s]+无法匹配,最终整个正则匹配失败。
解决方案
根据你的需求,我提供两种适配方案:
方案1:提取含市政缩写的街道整体 + 门牌号
如果你只需要把Driesstraat(Ide)作为街道相关部分,门牌号作为另一部分,只需要在第一捕获组的字符类里添加括号即可:
let re = /^(\d*[\p{L} \d'\/\\\-\.\(\)]+)[,\s]+(\d+)\s*([\p{L} \d\-\/'"\(\)]*)$/iu;
修改后第一捕获组就能匹配包含括号的街道部分,适配带市政缩写的地址格式。
方案2:单独提取街道名、市政缩写、门牌号
如果你希望把Driesstraat(街道)、Ide(市政缩写)、20(门牌号)分别提取出来,可以用更精准的正则:
let re = /^([\p{L}]+)(?:\(([\p{L}]+)\))?[,\s]+(\d+)\s*$/iu;
这个正则的逻辑是:
- 第一捕获组:匹配纯字母的街道名(
[\p{L}]+) - 非捕获组
(?:\(([\p{L}]+)\))?:匹配可选的括号包裹的市政缩写,第二捕获组提取括号内的内容 - 最后捕获组匹配门牌号
(\d+)
完整代码示例
以方案2为例,测试代码如下:
const adresInput = { value: "Driesstraat(Ide) 20" }; // 模拟输入值 let re = /^([\p{L}]+)(?:\(([\p{L}]+)\))?[,\s]+(\d+)\s*$/iu; let match = adresInput.value.match(re); if (match) { match.shift(); // 移除整个匹配的原始字符串 console.log(match.join('|')); // 输出: Driesstraat|Ide|20 }
这个代码既可以匹配带市政缩写的地址,也能兼容不带的情况(比如"Driesstraat 20"会输出Driesstraat||20,你可以根据需求处理空值)。
内容的提问来源于stack exchange,提问作者Brooklyn boeykens
相关产品推荐
相关产品推荐

