如何从文本块中提取包含城市/州/邮编的行?
提取地址文本块中的城市/州/邮编行
问题场景
我有多个包含地址信息的文本块,示例如下:
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}/,同样无效。
问题分析与解决方案
- 换行分割问题:原代码中
split(" ")是HTML转义后的错误写法,实际应该用/\r?\n/兼容不同系统的换行符(\n或\r\n),同时要过滤空行和无效行。 - 正则匹配精度问题:原正则要么太宽泛(比如
/\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
相关产品推荐
相关产品推荐

