JavaScript正则表达式-多行

3
我有一个具有以下文本结构的文件,希望将其中的日期解析为数组...
21/5/12 14:23:36: A: XXXX
YYY
ZZZ

21/5/12 14:23:25: B: XXX ZZZ YYY

21/5/12 14:23:25: B: XXX ZZZ YYY

我正在使用data.match(/[^\r\n]+\d+.*/g)来解析文件中的数据,结果为:

arr[0], 21/5/12 14:23:36: A: XXXX
arr[1], 21/5/12 14:23:25: B: XXX ZZZ YYY
arr[2], 21/5/12 14:23:25: B: XXX ZZZ YYY

有些不需要的第一项文本已被删除。

是否可以使用正则表达式来解析这样的文本?


如果你还没有注意到最新的更新:https://dev59.com/THrZa4cB1Zd3GeqP7t3X#20898252 :) - user1636522
5个回答

1

我不确定具体的需求。但是如果每个数据项之间有空行,您可以这样做:

var data ="21/5/12 14:23:36: A: XXXX\r\nYYY\nZZZ\r\n\r\n21/5/12 14:23:25: B: XXX ZZZ YYY\r\n\r\n21/5/12 14:23:25: B: XXX ZZZ YYY";
data.split(/\r\n\r\n/);
这段代码的结果是:

这里填写结果

["21/5/12 14:23:36: A: XXXX
YYY
ZZZ", "21/5/12 14:23:25: B: XXX ZZZ YYY", "21/5/12 14:23:25: B: XXX ZZZ YYY"]

0
如果您需要提取文本中的日期部分:
data.match(/\d{2}\/\d{2}\/\d{2} \d{2}:\d{2}:\d{2}/g)
它将产生以下结果:
arr[0], 21/5/12 14:23:36
arr[1], 21/5/12 14:23:25
arr[2], 21/5/12 14:23:25

0

你可以尝试更严格地解析文本吗?我建议像这样:

/\d+\/\d+\/\d+\s+\d+:\d+:\d+:[^\r\n]+(?:[\s\S]+?(?=\s^\d+\/))?/g

\d+\/\d+\/\d+\s+\d+:\d+: 这个正则表达式应该很容易理解,因为它是相当字面的。

[^\r\n]+ 是用来匹配同一行上剩余的所有内容。

(?:[\s\S]+?(?=\s^\d+\/))? 是用来匹配任何跟随其后的行,直到下一行以数字和斜杠(表示日期)开头。

而使用 .replace 替代,其中包含一个第二个替换的函数来清理(您也可以匹配然后循环遍历匹配项以删除换行符)。

var results = text.replace(/\d+\/\d+\/\d+\s+\d+:\d+:\d+:[^\r\n]+(?:[\s\S]+?(?=\s^\d+\/))?/g, function(m) {
    return m.replace(/\s+/g, " ");
});

输出:

21/5/12 14:23:36: A: XXXX YYY ZZZ 
21/5/12 14:23:25: B: XXX ZZZ YYY 
21/5/12 14:23:25: B: XXX ZZZ YYY

JSFiddle演示


0

你可以使用单个正则表达式完成它,但是根据你的数据源,第一个结果仍将在“XXXX”、“YYY”和“ZZZ”之间具有换行符:

var arr = data.split(/[\n\s]+(?=\d\d?\/\d\d?\/\d\d)/);

翻译: "剪切跟随日期的换行符和空格"。

如果您想要删除这些额外的换行符,您可以在分割之前进行替换:

var arr = data.replace(/[\s\n]+(?!\d\d?\/\d\d?\/\d\d)/g, ' ').split(/\s*\n/);

翻译: "将未跟随日期的换行符和空格替换为单个空格,然后在剩余的换行符上切割,包括前导空格"。


0
你也可以尝试使用以下修改后的正则表达式:

模式

/[^\r\n]+\d+[a-zA-Z:\s]+/g

您正在使用.*,这意味着匹配除换行符以外的任何字符(除非打开了dotall标志),因为您没有使用此标志,它不会捕获多行,但如果您打开它,则会将整个字符串作为一个匹配项捕获,这是不希望的。这是我提供的修改所产生的示例输入和输出:

输入

21/5/12 14:23:36: A: XXXX
YYY
ZZZ

21/5/12 14:23:25: B: XXX ZZZ YYY

21/5/12 14:23:25: B: XXX ZZZ YYY

输出

匹配 1:

21/5/12 14:23:36: A: XXXX
YYY
ZZZ

匹配 2:

21/5/12 14:23:25: B: XXX ZZZ YYY

匹配3:

21/5/12 14:23:25: B: XXX ZZZ YYY

我不确定我是否正确理解了你的意图,如果你不想要换行符,在第一次匹配中,你可以通过一些 JavaScript string 函数将它们删除,因为你仍然会得到整个匹配作为一个字符串,不幸的是我不懂 JavaScript。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,