2

我试图弄清楚如何使用正则表达式拆分字符串,同时将结果放入哈希表中。

例子:

var x = "Name: John Doe
Age: 30
Birth Date: 12/12/1981";

var arr = x.split(/Name:|Age:|Birth Date:/);

但是,虽然我可以吐出一个字符串,但问题是我无法将值存储为有用的格式,例如哈希等。因为某些信息可能并不总是显示。

我希望结果类似于:

var myHash = {}; // New object
myHash['Name'] = "John Doe";
myHash['Age'] = "30";
myHash['Birth Date'] = "12/12/1981";

有一个简单的原因吗?

编辑:该脚本用于从生成的报告中解析数据。而且格式并不总是有回车。它将用于自动生成通知,而不是手动输入所有内容。

例子:

Name: John Doe       Birth Date: 12/12/1981
Age: 30

但是,在查看示例之后,如果我首先在正则表达式匹配项前添加回车符或其他特殊字符,我可能会这样做。需要首先弄清楚如何在正则表达式匹配前添加一个值。

4

4 回答 4

5

您可以使用两个拆分首先将其拆分为项目,然后拆分每个项目:

var results = {};
var x = "Name: John Doe\nAge: 30\nBirth Date: 12/12/1981";
var pieces = x.split("\n"), part;
for (var i = 0; i < pieces.length; i++) {
    part = pieces[i].split(":");
    results[part[0]] = part[1];
}

工作示例:http: //jsfiddle.net/jfriend00/kYwq6/

根据您所做的具体操作,您可能希望在将每个键和值放入结果对象之前修剪每个键和值的开头和结尾的空格。

于 2012-07-19T06:22:07.257 回答
1

大声笑,其他人都在循环!我决定接受一点挑战,并尝试做一个快速测试,看看我如何在没有任何 while 或 fors 的情况下进行编码,同时保持字符串输入的原样:

    var x = "Name: John Doe Age: 30 Birth Date: 12/12/1981";

    x = x.replace(/[\t]/g,'');  //replace all tabs returns
    x = x.replace(/[\n\r]/g, '');  //replace all carriage returns
    x = "{" + x.replace("Name:","'Name':'").replace("Age:","','Age':'").replace("Birth","','Birth").replace("Date:","Date':'") + "'}";

    var results =  eval('(' + x + ')');

    var name = trim(results.Name);
    var age = trim(results.Age);
    var bday = trim(results.BirthDate);

我在这里所做的是将 x 转换为对象键值对。所以它看起来像这样:

{'Name':'John Doe','Age':'30','Birth Date':'12/12/1981'}

然后你只需调用 results.key

无论如何,看起来你在我有机会提出这个问题之前就已经找到了答案。

于 2012-07-20T05:16:11.137 回答
0

如果您的输入有回车或换行,您可以先在其上拆分,然后在冒号上拆分:

var x = "Name: John Doe\nAge: 30\nBirth Date: 12/12/1981";

function foo(s) {
  var a = s.split(/\n|\r/);
  var i = a.length;
  var b, obj = {};

  while (i--) {
    b = a[i].split(/\s*:\s*/);
    obj[b[0]] = b[1];
  }
  return obj;
}

var o = foo(x);
alert(o.Name); // John Doe
于 2012-07-19T06:29:35.817 回答
0

像这样的东西:

    var str = "Name: John Doe\nAge: 30\nBirth Date: 12/12/1981"
    var obj = {};
    var parts = str.split(/\n|\r/);
    for( var key in parts ){
      var tmp = parts[key].split(': ');
       obj[tmp[0]] = tmp[1];
    }
    alert(obj.Name)

PS抱歉加倍 - 无法删除消息

于 2012-07-20T07:01:23.863 回答