捕获正则表达式模式不适用于多行字符串

问题描述 投票:0回答:1

我正在尝试读取包含多行\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"
javascript regex
1个回答
1
投票

您可以使用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);
© www.soinside.com 2019 - 2024. All rights reserved.