正则表达式可选的非贪婪前瞻

时间:2021-06-30 16:41:34

标签: node.js regex

我目前正在尝试创建一个能够解析以下日志行的正则表达式:

    [210616|13:46:32.738|00017]  --> CONFD_OK
    [210616|13:46:32.738|00017] TRACE CDB_EXISTS /managed-element/fault-management/active-alarm/active-alarm-entries{oru oran-vendor-specific-alarm ORU[1]-ORU[1]/carrier0/antenna34/1004}[210616|13:46:32.738|00017]  --> CONFD_OK
    [210616|13:46:32.738|00017] TRACE CDB_END_SESSION [210616|13:46:32.738|00017]  --> CONFD_OK
    [210616|13:46:38.361|00270] TRACE Established new CDB session to ConfD

通过在这种情况下进行解析,它将选择初始 [时间] 后跟描述。

匹配:

[210616|13:46:32.738|00017]  --> CONFD_OK
[210616|13:46:32.738|00017] TRACE CDB_EXISTS /managed-element/fault-management/active-alarm/active-alarm-entries{oru oran-vendor-specific-alarm ORU[1]-ORU[1]/carrier0/antenna34/1004}
[210616|13:46:32.738|00017]  --> CONFD_OK
[210616|13:46:32.738|00017] TRACE CDB_END_SESSION [210616|13:46:32.738|00017]  --> CONFD_OK
[210616|13:46:38.361|00270] TRACE Established new CDB session to ConfD

I started out with \[[^\[\|]*\|[^\]]*\].* 选择初始部分,但我在克服日志中的多样性时遇到了一些麻烦:

  1. 每行可以有两个日志
  2. 日志中可以有 [#]

为了解决这些问题,我尝试实施非贪婪的 per 和积极的展望,但现在我只能选择第一个项目,并且只有在连续有两个项目的情况下。

https://regexr.com/611kh

\[[^\[\|]*\|[^\]]*\](.*?)(?=\[[^\[\|]*\|[^\]]*\])

我认为理想情况下,这将是我的初始序列,然后是非贪婪搜索,然后是在我的初始条件或结束行之前的积极展望。

就上下文而言,我正在为 Angular 组件中的 Angular 电子应用程序处理此问题。

任何建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

在此模式中 \[[^\[\|]*\|[^\]]*\].* 末尾的 .* 将匹配该行的其余部分

在此模式 \[[^\[\|]*\|[^\]]*\](.*?)(?=\[[^\[\|]*\|[^\]]*\]) 中,您将日志的开头与方括号匹配,然后捕获尽可能少的字符,直到结尾的正向前瞻断言为真。

如果断言不正确,.*? 非贪婪部分将足以匹配 0 个字符。

您可以做的是添加一个交替 |,它声明匹配尽可能少的字符,直到您遇到另一个日志开头或字符串的结尾。

\[[^\[\|]*\|[^\]]*\](.*?)(?=\[[^\[\|]*\|[^\]]*\]|$)

Regex demo

如果您想要 2 个不同的部分,您也可以使用 2 个捕获组。

(\[[^\[\|]*\|[^\]]*\])\s*(.*?)(?=\[[^\[\|]*\|[^\]]*\]|$)

Regex demo

答案 1 :(得分:1)

与其尝试编写一个正则表达式来统治它们,我会采用一种更简单的方法 - 字符串拆分。

首先,在开始新日志条目的模式上拆分( $(document).ready(function() { $('select').on('change', function() { $('button').attr('disabled', false); }); }); 工作正常),然后在 /(?=\[\d+\|)/ 处分割该行的其余部分,并在 ] 处再次拆分:

|

给予

var fileContents = `[210616|13:46:32.738|00017]  --> CONFD_OK
[210616|13:46:32.738|00017] TRACE CDB_EXISTS /managed-element/fault-management/active-alarm/active-alarm-entries{oru oran-vendor-specific-alarm ORU[1]-ORU[1]/carrier0/antenna34/1004}
[210616|13:46:32.738|00017]  --> CONFD_OK
[210616|13:46:32.738|00017] TRACE CDB_END_SESSION [210616|13:46:32.738|00017]  --> CONFD_OK
[210616|13:46:38.361|00270] TRACE Established new CDB session to ConfD`

var lines = fileContents.split(/(?=\[\d+\|)/).map(line => {
    var pos = line.indexOf(']');
    return line.slice(1, pos).split('|').concat(line.slice(pos + 1).trim());
});

console.log(lines);