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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 06:54:09