使用标题

时间:2018-06-11 15:27:49

标签: javascript parsing

我有一个这样的字符串:

&topic1
Lorem ipsum dolor sit amet, consectetur adipiscing elit, 
sed do 
eiusmod tempor incididunt ut 

&topic2
labore et dolore magna aliqua. Ut enim ad minim 
www.example.com/test?id=1&name=abc
veniam, quis nostrud exercitation ullamco lab

&topic3
hello

每次有(beginning of line) + & + name + \n时,都应将其解析为新项目。

使用Javascript以这种方式解析它的最自然方式是什么:

[['topic1', 'Lorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do\neiusmod tempor incididunt ut'],
 ['topic2', 'labore et dolore magna aliqua. Ut enim ad minim\nwww.example.com/test?id=1&name=abc\nveniam, quis nostrud exercitation ullamco lab'],
 ['topic3', 'hello']]

这个方法有几个问题:



var s = "&topic1\nLorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do\neiusmod tempor incididunt ut\n\n&topic2\nlabore et dolore magna aliqua. Ut enim ad minim\nwww.example.com/test?id=1&name=abc\nveniam, quis nostrud exercitation ullamco lab\n\n&topic3\nhello";

s.split('&').forEach(function(elt) { console.log(elt.split('\n')[0], elt.split('\n').slice(1)); });




  • 第一项是空的(之后可以删除,但也许有更干净的方式?)

  • 如果&位于一行(而不是开头),则此代码无法正常工作

  • 我希望标题标题后面的文字在一个字符串中(例如Lorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do\neiusmod tempor incididunt ut),而不是为每个\n分割

如何进行更清晰的解析?

1 个答案:

答案 0 :(得分:1)

首先按换行符拆分,然后将它们连接起来,直到找到新主题:



var s = "&topic1\nLorem ipsum dolor sit amet, consectetur adipiscing elit,\nsed do\neiusmod tempor incididunt ut\n\n&topic2\nlabore et dolore magna aliqua. Ut enim ad minim\nwww.example.com/test?id=1&name=abc\nveniam, quis nostrud exercitation ullamco lab\n\n&topic3\nhello";

const result = [];
let acc = [];

for(const line of s.split("\n")) {
  if(line[0] === "&") {
    // New topic found
    result.push(acc);
    acc = [line.substr(1), ""];
  } else {
    acc[1] += (acc[1] && "\n") + line;
  }
}

result.push(acc);
result.shift();   // removes the first element from an array and returns that removed element
console.log(result);