Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式-多行_Javascript_Regex - Fatal编程技术网

Javascript正则表达式-多行

Javascript正则表达式-多行,javascript,regex,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

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

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
第一项的某些文本已被删除,这是不需要的


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

如果需要提取文本的日期部分:

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

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

/\d+\/\d+\/\d+\s+\d+:\d+:\d+:[^\r\n]+(?:[\s\S]+?(?=\s^\d+\/))?/g
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/);
\d+\/\d+\/\d+\s+\d+:\d+:\d+:
应该很容易理解,因为它非常直白

[^\r\n]+
将匹配同一行中剩余的所有内容

(?:[\s\s]+?(?=\s^\d+\/)?
将匹配后面的任何行,直到下一行以数字开头,后跟正斜杠(表示日期)

并使用
.replace
,使用一个包含第二个replace的函数进行清理(您还可以进行匹配,然后循环匹配以删除换行符)

输出:

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

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

/\d+\/\d+\/\d+\s+\d+:\d+:\d+:[^\r\n]+(?:[\s\S]+?(?=\s^\d+\/))?/g
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"]

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

翻译为:“在换行符和空格后加上日期”

如果要删除这些额外的换行符,可以在拆分之前替换它们:

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

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

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

模式

/[^\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
输出

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。

以防你没有注意到最新的更新:)