【问题标题】:Split a text with header拆分带有标题的文本
【发布时间】:2018-06-12 02:00:44
【问题描述】:

我有一个这样的字符串:

&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,都要解析成一个新的item。

用 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 拆分

如何进行更干净的解析?

【问题讨论】:

    标签: javascript parsing


    【解决方案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);

    【讨论】:

    • @basj 我很抱歉(在我的手机上不起作用),但请随时编辑 :)
    • 哇,你在手机上写代码,恭喜:)(我发现在这么小的屏幕/小键盘上格式化代码太难了!)。我编辑成一个代码sn-p。非常感谢!
    • @basj 都是关于习惯的,感谢您的编辑,我很乐意提供帮助:)
    • 一个小角落@JonasW.: 如果var s = "&topic1\nLo\nrem\n&topic2\nipsum",那么我想要[["topic1", "Lo\nrem"], ["topic2", "ipsum"]] 而不是Lo\nrem\n 而不是ipsum\n。任何想法?我也许应该删除最后的\n,但更好的方法是什么?
    • @basj 如果acc[1] 是一个空字符串(“”),它将采用该空字符串(因此它不会在开头添加换行符)否则如果acc[1] 不再为空,它取而代之的是\n,因此它会附加一个换行符。这种行为称为短路和真实性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多