我正在尝试读取包含多行\n
的字符串,并且该字符串具有以下模式:
Total : 30
================
Loaded : 27
Loading : 0
Failed : 3
Done.. time taken : 3.49 seconds.
=============
2020-03-08 15:39:26
包含所花费时间的行有时可以以毫秒,秒或分钟表示。因此,我需要捕获单位之前的数字,单位本身以及Failed
表示的数字。
我能够提取持续时间加上单位,没有任何问题。也许是因为它们都在同一行。
let matches = /taken\D+([\d\.]+)\s+(\w+)/g.exec(trace);
matches[1]; // 3.49
matches[2]; // seconds
但是当我尝试提取Failed
数字时,正则表达式不起作用。
/Failed\s+:\s(\d+).*?taken\D+([\d\.]+)\s+(\w+)/g
/Failed\s+:\s(\d+).*?taken\D+([\d\.]+)\s+(\w+)/gm
/Failed\s+:\s(\d+)[.\n\r]*?taken\D+([\d\.]+)\s+(\w+)/g
没有一个有效。我知道我可以通过执行正则表达式之前删除所有新行\n
字符的方法来解决此问题,但我想知道我的那部分犯了什么错误?
let trace = "Total : 30\n"
+ "================\n"
+ "Loaded : 27\n"
+ "Loading : 0\n"
+ "Failed : 3\n"
+ "\n"
+ "Done.. time taken : 3.49 seconds.\n"
+ "=============\n"
+ "2020-03-08 15:39:26";
let pattern = /Failed\s+:\s+(\d+)[\n\r.]*?taken\D+([\d\.]+)\s+(\w+)/gm;
let matches = pattern.exec(trace);
let failedCount = matches[1]; // should be "3"
let timeTaken = matches[2]; // should be "3.49"
let timeUnit = matches[3]; // should be "seconds"
您可以使用s
使.
表达式包含\n
。像这样:
let trace = "Total : 30\n"
+ "================\n"
+ "Loaded : 27\n"
+ "Loading : 0\n"
+ "Failed : 3\n"
+ "\n"
+ "Done.. time taken : 3.49 seconds.\n"
+ "=============\n"
+ "2020-03-08 15:39:26";
let pattern = new RegExp("Failed\\s+:\\s+(\\d+).*?taken\\D+([\\d\\.]+)\\s+(\\w+)", "s");
let matches = pattern.exec(trace);
let failedCount = matches[1]; // should be "3"
let timeTaken = matches[2]; // should be "3.49"
let timeUnit = matches[3]; // should be "seconds"
console.log(failedCount, timeTaken, timeUnit);