我目前正在尝试创建一个能够解析以下日志行的正则表达式:
[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 \[[^\[\|]*\|[^\]]*\].*
选择初始部分,但我在克服日志中的多样性时遇到了一些麻烦:
为了解决这些问题,我尝试实施非贪婪的 per 和积极的展望,但现在我只能选择第一个项目,并且只有在连续有两个项目的情况下。
\[[^\[\|]*\|[^\]]*\](.*?)(?=\[[^\[\|]*\|[^\]]*\])
我认为理想情况下,这将是我的初始序列,然后是非贪婪搜索,然后是在我的初始条件或结束行之前的积极展望。
就上下文而言,我正在为 Angular 组件中的 Angular 电子应用程序处理此问题。
任何建议将不胜感激。
答案 0 :(得分:1)
在此模式中 \[[^\[\|]*\|[^\]]*\].*
末尾的 .*
将匹配该行的其余部分
在此模式 \[[^\[\|]*\|[^\]]*\](.*?)(?=\[[^\[\|]*\|[^\]]*\])
中,您将日志的开头与方括号匹配,然后捕获尽可能少的字符,直到结尾的正向前瞻断言为真。
如果断言不正确,.*?
非贪婪部分将足以匹配 0 个字符。
您可以做的是添加一个交替 |
,它声明匹配尽可能少的字符,直到您遇到另一个日志开头或字符串的结尾。
\[[^\[\|]*\|[^\]]*\](.*?)(?=\[[^\[\|]*\|[^\]]*\]|$)
如果您想要 2 个不同的部分,您也可以使用 2 个捕获组。
(\[[^\[\|]*\|[^\]]*\])\s*(.*?)(?=\[[^\[\|]*\|[^\]]*\]|$)
答案 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);