我有一个具有以下文本结构的文件,并希望将日期解析为数组...
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
第一项的某些文字已被删除,这是不可取的。
是否可以使用正则表达式来解析这样的文本?
答案 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
答案 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。