0

I want to split the following lines into an array in Javascript:

Jun 02 16:45:04 [steveh]  [info] test1
Jun 02 16:45:12 [steveh]  [info] test2
Jun 02 16:45:12 [steveh]  [info] test3
test 3.1
test 3.2
Jun 02 16:45:16 [steveh]  [info] test4

I can do this with:

var arr = data.split(/\r?\n/);

Which gets me that:

[
    "Jun 02 16:45:04 [steveh]  [info] test1",
    "Jun 02 16:45:12 [steveh]  [info] test2",
    "Jun 02 16:45:12 [steveh]  [info] test3",
    "test 3.1",
    "test 3.2",
    "Jun 02 16:45:16 [steveh]  [info] test4"
]

So far so good, but the problem is, that I want not 6 items in that array, I want just 4 something like this:

[
    "Jun 02 16:45:04 [steveh]  [info] test1",
    "Jun 02 16:45:12 [steveh]  [info] test2",
    "Jun 02 16:45:12 [steveh]  [info] test3
    test 3.1
    test 3.2",
    "Jun 02 16:45:16 [steveh]  [info] test4"
]

I played around some time with the js .match() and .split() functions, but couldn't figure it out.

Here is as jsbin: http://jsbin.com/icufef/1/edit

4

3 回答 3

1

在 split 中使用以下 RE:

 /\r?\n(?=[^\n]*\[info\])/

仅当以下行包含时才在换行符上拆分[info]

于 2013-06-02T17:56:54.080 回答
0

您必须搜索换行符,后跟一个月短名称,因此它类似于\r?\n(Jan|Feb|March|Apri...|Dec)拆分参数。您需要知道您的数据如何提供这些月份名称,而不是“测试”而不是“可能”来捕捉它。

编辑:哦,Xavier 是对的:您应该将这些条目标记为真正的换行符,而不是将其输入拆分:

data.replace('/^(Jan|Feb...) /', 'BREAKME$1');
data.split('/\r?\nBREAKME');
于 2013-06-02T17:43:24.510 回答
0

除非您对日期的格式有所了解,否则您通常无法做到这一点……好吧,我想如果您跳过日期并将其从[steveh] [info]成对中确定,您可能会找到解决方案。但是test 3.1等等呢?什么可能的数据可以进入那里?可以有带括号的文字吗?能有约会吗?在不知道这些数据的结构的情况下,您愿意走多远来确保对其进行合理的解析?

总是有可能想出大部分正确解析它的解决方案,但会错过一些场景。

根据数据的不同,这些情况可能会使数据无法正确解析,也就是说,如果记录器记录的行中还包含一条看起来像新日志行的行,例如“foo\nJun 02 16:47:16 [ steveh] [info] test4" 并且该字符串中给出的日期恰好是发生在连续日志记录之间的日期,仅通过查看日志数据就不可能将该行与其他日志行分开。

于 2013-06-02T17:51:47.293 回答