Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何解析&;将文本内容格式化为对象_Javascript_Regex_String_Parsing - Fatal编程技术网

Javascript 如何解析&;将文本内容格式化为对象

Javascript 如何解析&;将文本内容格式化为对象,javascript,regex,string,parsing,Javascript,Regex,String,Parsing,正如标题所说,我需要从带有特定字段的长文本中提取内容 我的这篇文章如下 Name: David Jones Office Address: 148 Hulala Street Date: 24/11/2013 Agent No: 1234, Address: 259 Yolo Road Start Date: 22/11/2013 Due Date: 29/11/2013 Type: Human Properties: None Ago: 29 我有文本中特定字段的标签 Name, Offic

正如标题所说,我需要从带有特定字段的长文本中提取内容

我的这篇文章如下

Name: David Jones
Office Address: 148 Hulala Street Date: 24/11/2013
Agent No: 1234,
Address: 259 Yolo Road Start Date: 22/11/2013 Due Date: 29/11/2013
Type: Human Properties: None Ago: 29
我有文本中特定字段的标签

Name, Office Address, Date, Agent No, Address, Type, Properties, Age
我想得到的结果是

Name: 'David Jones',
Office Address: '148 Hulala Street',
Date: '24/11/2013',
Agent No: '1234',
Address: '259 Yolo Road',
Type: 'Human'
Properties: 'None',
Age: ''
它已经完全解析了每个字段的内容<代码>这里需要注意的重要一点是,原始文本可能有打字错误(例如,Ago而不是Age)和标签列表中不存在的额外字段(例如,标签列表中不存在开始日期和截止日期)。因此,代码将忽略任何不匹配的文本,并尝试只查找匹配的结果

我试图通过对每一行进行循环来解决这个问题,检查一行是否包含字段,并查看该行是否还包含更多字段

目前我有以下代码

structure = ['Name','Office Address','Date','Agent No','Address','Type','Properties','Age'];
obj = {};
for (i = 0; i < textLines.length; i++) {
  matchingFields = [];
  for (j = 0; j < structure.length; j++) {
    if (textLines[i].indexOf(structure[j] + ':') !== -1) {
      if (matchingFields.length === 0 && textLines[i].indexOf(structure[j] + ':') === 0) {
        matchingFields.push(structure[j]);
        structure.splice(structure.indexOf(structure[j--]), 1);
      } else if (textLines[i].indexOf(structure[j] + ':') > textLines[i].indexOf(matchingFields[matchingFields.length-1])) {
        matchingFields.push(structure[j]);
        structure.splice(structure.indexOf(structure[j--]), 1);
      }
    }

    for (j = 0; j < matchingFields.length; j++) {
      if (j !== matchingFields.length-1) {
        obj[matchingFields[j]] = textLines[i].slice(textLines[i].indexOf(matchingFields[j]) + matchingFields[j].length, textLines[i].indexOf(matchingFields[j+1]));
      } else {
        obj[matchingFields[j]] = textLines[i].slice(textLines[i].indexOf(matchingFields[j]) + matchingFields[j].length);
      }

      obj[matchingFields[j]] = obj[matchingFields[j]].replace(':', '');
      if (obj[matchingFields[j]].indexOf(' ') === 0) {
        obj[matchingFields[j]] = obj[matchingFields[j]].replace(' ', '');
      }
      if (obj[matchingFields[j]].charAt(obj[matchingFields[j]].length-1) === ' ') {
        obj[matchingFields[j]] = obj[matchingFields[j]].slice(0, obj[matchingFields[j]].length-1);
      }
    }
  }
structure=['Name'、'Office Address'、'Date'、'Agent No'、'Address'、'Type'、'Properties'、'Age'];
obj={};
对于(i=0;itextLines[i].indexOf(matchingFields[matchingFields.length-1])){
matchingFields.push(结构[j]);
结构拼接(结构索引of(结构[j--]),1);
}
}
对于(j=0;j
在某些情况下,它可以正常工作,但与
'Office Address:'
'Address:'
'Office Address:'
现有值一起进入
'Address:'
。此外,代码看起来凌乱难看。也似乎是一种暴力强迫

我想应该有更好的方法。例如使用正则表达式或类似的东西。但是没有外部库

如果您有任何想法,我将感谢您的分享。

这可能有助于:

> a.substr(a.indexOf("Name"), a.indexOf("Office Address")).split(":")
["Name", " David Jones "]

假设属性由换行符分隔,则可以使用以下方法创建一个对象,将每个属性映射到其值:

var str = "Name: David Jones\nOffice Address: 148 Hulala Street\nDate: 24/11/2013\nAgent No: 1234,\nAddress: 259 Yolo Road\\nType: Human Properties: None Age: 29";
var output = {};

str.split(/\n/).forEach(function(item){ 
    var match = (item.match(/([A-Za-z\s]*):\s([A-Za-z0-9\s\/]*)/));
    output[match[1]] = match[2];
});

console.log(output)

不幸的是,我的初始信息是问题中的第一个文本框和每个属性的标签。但我想我可以通过在每个属性前插入换行符并编写代码来解决这一问题。谢谢,我现在就试试。哦,我忘了我的真实代码与问题中的文本不同……示例是随机生成的,实际文本可能会有冲突Tan错误的字段(列)名称。这就是我很难解析的原因。我将发布另一个问题。使它与我以前的注释和您的代码一样工作!
match=(item.match(/(.*):(.*)/);
更改了正则表达式,因为它可能还包含一些特殊字符。谢谢!