我正在使用 Javascript Regex 来处理一些原始数据并将其转换为二维数组。
任务简报(仅限 JS):
将原始字符串数据转换为二维数组。
原始数据输入:
这是一个包含 4 个条目的示例,新条目将转到换行符。条目 3 带有多行内容。
2012/12/1, AM12:21 - user1: entry1_wasehhjdsaj
2012/12/2, AM9:42 - user2: entry2_bahbahbah_dsdeead
2012/12/2, AM9:44 - user3: entry3_Line1_ContdWithFollowingLine_bahbahbah
entry3_Line2_ContdWithABoveLine_bahbahbah_erererw
entry3_Line3_ContdWithABoveLine_bahbahbah_dsff
2012/12/4, AM11:48 - user7: entry4_bahbahbah_fggf
(原始字符串数据,没有空行。) 更新:抱歉造成误导,内容的结尾不必具有相同的 END 模式,而只需换行即可。
该模式实际上如何结束?(感谢@Tim Pietzcker 的评论)。 内容应以换行符结束,并以下一个条目时间戳开始。 (您可以假设条目内容不包含任何类似的时间戳模式。)
我知道这可能是一个麻烦的正则表达式问题,因此任何其他实现相同目标的 JS 方法也将被接受。
我当前的正则表达式与捕获组:
/^([0-9]{4}|[0-9]{2})[\/]([0]?[1-9]|[1][0-2])[\/]([0]?[1-9]|[1|2][0-9]|[3][0|1]), ([A|P])M([1-9]|1[0-2]):([0-5]\d) - (.*?): (.*)/gm
期望的捕获结果:
匹配 1
2012
12
1
A
12
21
用户1
entry1_wasehhjdsaj
比赛 2
2012
12
2
A
9
42
用户2
entry2_bahbahbah_dsdeead
第三场比赛
2012
12
2
A
9
44
用户3
entry3_Line1_ContdWithFollowingLine_bahbahbahentry3_Line2_ContdWithABoveLine_bahbahbah_erererwentry3_Line3_ContdWithABoveLine_bahbahbah_dsff
比赛 4
(已跳过...)
问题:
捕获条目 3 时出现问题,无法捕获条目 3 的第 2 行和第 3 行内容。如果该条目仅包含一行内容,则正则表达式工作正常。
如何捕获具有多行内容的条目 3? 我尝试使用 m 修饰符,但我不知道如何同时处理多行内容和换行符条目.
如果用js正则表达式无法实现,请建议另一种js方法将原始数据转换为二维数组作为最终目标。
谢谢!
最佳答案
多行在 JavaScript 中不能以这种方式工作,但您可以使用 [\s\S]
解决它。这个类也匹配每个字符和\n。请注意后面的 *?
而不是 *
,以防止它贪婪并只执行到第一个 END
:
^([0-9]{4}|[0-9]{2})[\/]([0]?[1-9]|[1][0-2])[\/]([0]?[1-9]|[1|2][0-9]|[3][0|1]), ([A|P])M([1-9]|1[0-2]):([0-5]\d) - (.*?): ([\s\S]*?END)$
关于Javascript正则表达式从每个换行条目中捕获多行内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35113895/