Javascript正则表达式 - 多行

时间:2014-01-03 05:12:12

标签: javascript regex

我有一个具有以下文本结构的文件,并希望将日期解析为数组...

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

第一项的某些文字已被删除,这是不可取的。

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

5 个答案:

答案 0 :(得分: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"]

答案 1 :(得分: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

答案 2 :(得分:0)

您可能尝试更严格地解析文本?我建议这样的事情:

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

\d+\/\d+\/\d+\s+\d+:\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 demo

答案 3 :(得分: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/);

翻译:“替换没有单个空格的日期的换行符和空格,然后剪切剩余的换行符,包括前面的空格”。

答案 4 :(得分:0)

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

<强>模式

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

你正在使用.*这意味着除了新行之外的任何字符(除了dotall标志打开的情况除外),因为你没有使用这个标志它不会捕获多行,但如果你把它放了在它上面捕获整个字符串作为一个匹配,这是不希望的。以下是我提供的修改产生的示例输入和输出:

<强> INPUT

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。