【问题标题】:Help parsing string (City, State Zip) with JavaScript帮助使用 JavaScript 解析字符串(City, State Zip)
【发布时间】:2011-07-03 03:26:10
【问题描述】:

我有一个格式如下的字符串:

城市,州邮编

我想从此字符串中获取 City 和 State。

如何使用 JavaScript 做到这一点? 编辑:请注意,当他到达这里时,他没有提到他已经有了邮政编码,如果这对您的解决方案有帮助 ~~ drachenstern

【问题讨论】:

标签: javascript regex parsing


【解决方案1】:
var address = "San Francisco, CA 94129";

function parseAddress(address) {
    // Make sure the address is a string.
    if (typeof address !== "string") throw "Address is not a string.";

    // Trim the address.
    address = address.trim();

    // Make an object to contain the data.
    var returned = {};

    // Find the comma.
    var comma = address.indexOf(',');

    // Pull out the city.
    returned.city = address.slice(0, comma);

    // Get everything after the city.
    var after = address.substring(comma + 2); // The string after the comma, +2 so that we skip the comma and the space.

    // Find the space.
    var space = after.lastIndexOf(' ');

    // Pull out the state.
    returned.state = after.slice(0, space);

    // Pull out the zip code.
    returned.zip = after.substring(space + 1);

    // Return the data.
    return returned;
}

address = parseAddress(address);

这可能比使用正则表达式和 String.split() 更好,因为它考虑到州和城市可能有空格。

编辑:错误修复:它只包括多词状态名称的第一个词。

这是一个缩小版。 :D

function parseAddress(a) {if(typeof a!=="string") throw "Address is not a string.";a=a.trim();var r={},c=a.indexOf(',');r.city=a.slice(0,c);var f=a.substring(c+2),s=f.lastIndexOf(' ');r.state=f.slice(0,s);r.zip=f.substring(s+1);return r;}

【讨论】:

  • 请注意,他首先也键入了邮政编码,因此您可以删除邮政编码,然后专注于拆分最后出现的逗号。
  • 如果我可以要求审核,您对我的解决方案有何看法?
  • @drachenstern 我不明白你的意思,他一开始也在输入邮政编码。
  • @tyler ~ 如果它可以帮助您在此处更好地解析地址,那么您已经在其他地方获得了原始邮政编码。 (我也没有在我的解决方案中使用它)〜当他粗略地提出原始问题时我就在那里。我不知道他为什么认为 RegEx 在这里有帮助。
  • @drachenstern 唯一的区别是缺少 1 行代码。您可以使用 RegExp 来检查无效字符:/[^\n\w\s\,]/
【解决方案2】:

有很多方法可以做到这一点。这是一个非常幼稚的:

var parts = "City, State ZIP".split(/\s+/); // split on whitespace
var city = parts[0].slice(0, parts[0].length - 1); // remove trailing comma
var state = parts[1];
var zip = parts[2];

这是说明城市或州或两者中存在空间的原因:

var parts = "san fran bay, new mex state 666666".split(/\s+|,/),
    partition = parts.indexOf(""),
    city = parts.slice(0, partition).join(" "),
    state = parts.slice(partition + 1, -1).join(" "),
    zip = parts.pop();

只有当你有幸处于支持destructuring assignment的环境中时,最后一个才有效:

var city, statezip, state, zip, parts;
[city, statezip] = "Spaced City, New Mexico ZIP".split(/,\s*/);
parts = statezip.split(/\s+/);
zip = parts.pop();
state = parts.join(" ");

当然,这些都不执行任何验证。

【讨论】:

  • San Francisco, CA 11111New York City, NY 11111 似乎破坏了你的方法。再试一次。
  • @drachenstern 因为它在所有空间上分割。
  • 什么样的城市名字中有空格?嘘。无论如何,我至少修复了其中一个。 +1 给@tylermwashburn 以关注小事——比如,你知道,正确性——但看看所有代码!
  • @drachenstern 我在解释它为什么会中断。它期望 city 只是一个单词,所以当它有 2 时,它认为第二个单词是 state,state 是邮政编码。
  • @lwburk 函数 parseAddress(a) {var r={},c=a.indexOf(',');r.city=a.slice(0,c);var f=a .substring(c+2),s=f.lastIndexOf(' ');r.state=f.slice(0,s);r.zip=f.substring(s+1);return r;} xD 什么现在?
【解决方案3】:

好的,既然建议正则表达式不好,这是我的解决方案。它考虑了其中有空间的城市,这里的其他回复似乎没有这样做:

    var str = "New York, NY 20101";
    var cityAndRest = str.split(',');
    var city = cityAndRest[0];
    var stateAndZip = cityAndRest[1].trim().split(' ');
    var state = stateAndZip[0];
    var zip = stateAndZip[1];

【讨论】:

  • 各州可能也有空格
【解决方案4】:

第一个假设:仅限美国地址。

首先找出最后 5 个或最后 10 个字符是否为数字。一个更简单的测试是查看最后一个字符是否为数字。如果是这样,它可能包含邮政编码。然后进行一个简单的测试,看看最后 10 个是否包含空格 (city #####) 或最后 10 个是否包含破折号 (12345-6789) 以确定它是 5 还是 5+4 拉链。我们将测试连字符且没有空格。 (city-du-lac 12345 捕获-lac 12345

接下来,所有地址都用逗号分隔城市和州,所以我们需要最后一个逗号。找到最后一个逗号的索引,并在那里拆分。我不知道有哪个城市在其名称中使用逗号,如果我能提供帮助,我肯定不会让我的解析器突然出现未知数。我确实忽略了Washington DC 也可能是Washington, DC 的事实。我认为边缘案例适用于库,而不是一次性脚本。

最后,修剪所有剩余的内容以删除尾随或前导空格。

function IsNumeric(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

var addr = 'New York City, New York 10101';
//var addr = 'San Bernadino, CA 11111';
function getCityStateZip(addr){
  var city; var state;var zip;
  city = ''; state = ''; zip = '';
  var addrLen = addr.length;
  if ( IsNumeric( addr.substring(addrLen - 1) ) ) {
    //contains a zipcode - just a sanity check
    //get last 10 characters for testing easily
    var lastTen = addr.substring( addrLen - 10 );
    if ( lastTen.indexOf('-') > 0 && ( lastTen.indexOf(' ') == -1 ) ) {
      //found a hyphen and no space (matches our complex rule for zipcodes)
      zip = lastTen;
    } else {
      zip = addr.substring( addrLen - 5 ); //assume a basic 5 zip code
    }
  }
  var zipLen = zip.length;
  addrLen = addrLen - zipLen - 1;
  addr = addr.substring(0, addrLen ); //remove the chars we just moved into zip

  var lastComma = addr.lastIndexOf(',');
  if ( lastComma == -1 ) {
    //you have a problem, how do you want to handle it?
  }
  city = addr.substring(0,lastComma); //skip the comma itself, yes?
  state = addr.substring(lastComma + 2);
  return { 'city':city,'state': state,'zip': zip};
}

getCityStateZip(addr)

IsNumericjs函数可以在这里找到Validate decimal numbers in JavaScript - IsNumeric()

【讨论】:

  • 美国和加拿大地址,抱歉,aoudad 澄清了 b
  • 所以我不熟悉加拿大的邮政地址,可能存在一些我不知道的问题。你确定那里还没有地址解析库吗?
【解决方案5】:

简单的方法但没有验证:

var addrObj={};
parseAddress("Beverly Hills, CA 90210",addrObj);

function parseAddress(address, addrObj){
  var arr=address.replace(","," ").split(" ");
  addrObj.zip=arr.pop();
  addrObj.state=arr.pop();
  addrObj.city=arr.join(" ");
}

【讨论】:

    【解决方案6】:

    对于这种类型的事情,您可能需要使用 JavaScript 的 RegEx 函数。

    这里有一些信息:

    http://www.javascriptkit.com/javatutors/re.shtml

    【讨论】:

    • 我认为他知道基于正则表达式标签。你没有提供答案。
    • 问题是“我如何使用 jQuery/javascript 做到这一点?”不是“那是什么正则表达式?”
    • 按照这个逻辑,通过编写代码来完成的答案是否可以接受?
    • 这种东西属于 cmets,而不是答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多