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

如何从文本块中提取包含城市/州/邮编的行?

提取地址文本块中的城市/州/邮编行

问题场景

我有多个包含地址信息的文本块,示例如下:

Fake Name
Business name
60 N Address Ave.
San Jose, CA 95126
(555)255-5555
Email: emailaddress@aol.com

需要提取其中包含城市/州/邮编的行(比如示例里的San Jose, CA 95126),但该行在每个文本块中的位置不固定。我尝试了两段正则代码,但都没得到预期结果。

尝试过的代码

function findStateLine(text) {
    const lines = text.split("
");

    const regex = /\b[A-Z]{2}\b/;

    for (let i = 0; i < lines.length; i++) {
        if (regex.test(lines[i])) {
            return lines[i].trim();
        }
    }

    return null;
}

const stateLine = findStateLine(text);
console.log(stateLine);

另外还试过正则/[\w ]+, \w{2} \d{5}/,同样无效。

问题分析与解决方案

  1. 换行分割问题:原代码中split(" ")是HTML转义后的错误写法,实际应该用/\r?\n/兼容不同系统的换行符(\n或\r\n),同时要过滤空行和无效行。
  2. 正则匹配精度问题:原正则要么太宽泛(比如/\b[A-Z]{2}\b/可能匹配到其他两位大写字母的内容),要么不够全面(/[\w ]+, \w{2} \d{5}/不支持城市名中的连字符、点号等字符,且未限制整行匹配)。

修正后的代码如下:

function findStateLine(text) {
    // 兼容不同换行符,清理空行和首尾空格
    const lines = text.split(/\r?\n/)
                      .map(line => line.trim())
                      .filter(line => line.length > 0);

    // 精准匹配城市名, 州缩写 5位邮编的格式
    // 支持城市名包含字母、空格、连字符、点号
    const addressRegex = /^[A-Za-z\s\-.]+,\s[A-Z]{2}\s\d{5}$/;

    for (const line of lines) {
        if (addressRegex.test(line)) {
            return line;
        }
    }

    return null;
}

// 测试示例
const sampleText = `Fake Name
Business name
60 N Address Ave.
San Jose, CA 95126
(555)255-5555
Email: emailaddress@aol.com`;

console.log(findStateLine(sampleText)); // 输出: San Jose, CA 95126

正则说明

  • ^ 和 $:确保匹配整行内容,避免部分匹配(比如邮箱里的类似片段)
  • [A-Za-z\s\-.]+:匹配城市名,支持常见格式(如Los Angeles、St. Louis)
  • ,\s:匹配城市名后的逗号加空格
  • [A-Z]{2}:匹配两位大写的美国州缩写
  • \s\d{5}:匹配空格加5位数字邮编

如果需要支持带扩展码的邮编(如95126-1234),可以把正则修改为:

const addressRegex = /^[A-Za-z\s\-.]+,\s[A-Z]{2}\s\d{5}(?:-\d{4})?$/;

内容的提问来源于stack exchange,提问作者Maurice Fiorani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 11:32:41