正则表达式在javascript中拆分行

正则表达式在javascript中拆分行,javascript,regex,arrays,split,match,Javascript,Regex,Arrays,Split,Match,我想在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 我可以这样做: var arr = data.split(/\r?\n/); 这让我明白: [

我想在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
我可以这样做:

var arr = data.split(/\r?\n/);
这让我明白:

[
    "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"
]
到目前为止还不错,但问题是,我不希望该数组中有6个项目,我只希望有4个类似的项目:

[
    "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"
]
我在js
.match()
.split()
函数中玩了一段时间,但没有弄清楚


这里是jsbin:

您必须搜索换行符,后跟一个月的短名称,因此它类似于拆分参数的
\r?\n(一月|二月|三月|四月|十二月)
。您需要知道您的数据如何提供这些月份名称,而不是“test”来表示“May be”,以捕捉五月的数据

编辑: 哦,Xavier是对的:与其将其输入split,不如将这些条目标记为真正的换行符:

data.replace('/^(Jan|Feb...) /', 'BREAKME$1');
data.split('/\r?\nBREAKME');

一般来说,除非你对约会的格式有所了解,否则你不能这么做。。。好吧,我想如果你跳过日期,以
[steveh][info]
对为基础,你可能会找到一个解决方案。但是
测试3.1等呢?哪些可能的数据可以放在那里?是否可以有带括号的文本?会有约会吗?在不知道这些数据是如何构造的情况下,您愿意走多远才能确保这些数据被合理地解析

总是有可能提出一个解决方案,对其进行大致正确的解析,但会错过一些场景


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

在拆分中使用以下RE:

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

仅当以下行包含
[info]

此数据从何处获取时,才在换行符上拆分?实际上是从返回服务器日志的Web服务获取的。我想在javascript中过滤该日志,因此我需要一个数组。但是在测试中,你可以把它当作多行字符串来处理。如果你知道你想要得到的确切格式,你可以尝试使用正则表达式来匹配这个字符串,而不是拆分。但是,这不会从输出中删除月份名称吗?你需要在该组中添加一个前瞻:)之后,我认为它的工作方式与OP想要的一样。添加一个
?=
如下:
\r?\n(?=Jan | Feb | Mar | Apr | May | Jun | Jun | Jul | Aug | Sep | Sep | Oct | Nov | Dec)
我必须承认:通常我只是在一个循环中结束:只要没有“真正的新行”出现时,我将该行添加到最后一个变量,当“真正的新行”出现时,我将最后一个变量推到数组中。我同意,如果没有错误的可能性,这是不可能的。人们必须接受risc。如果日志格式可以“调优”(配置),可以尝试在日志格式中找到一个好的开始标志使用一些约定来分隔日志文件,并为您分隔,那么就没有必要讨论这个问题——除非它所犯的错误是无法容忍的。相反,任何想要使用此Web服务的人都必须自己制作蹩脚的解析器,然后,如果记录器更改其格式,使用该服务的每个人都必须x他们的解析器。我可以看到有人可能想用Web服务公开原始日志文件的正当理由,但互操作性并不在其中。我只是想知道,每当我看到这样的问题时,我的帮助是否只是在帮助修补一艘本该沉没的注定要沉没的船,如果这艘船已经沉没,每个人都会过得更好沉没。