首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex可选的非贪婪查找

Regex可选的非贪婪查找
EN

Stack Overflow用户
提问于 2021-06-30 16:41:34
回答 2查看 78关注 0票数 1

我目前正在尝试创建一个regex,它能够解析以下几行日志:

代码语言:javascript
复制
    [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

在这种情况下,通过解析,它将选择初始时间,然后是描述。

比赛:

代码语言:javascript
复制
[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

我刚开始的时候 \[[^\[\|]*\|[^\]]*\].*来选择初始部分,但我在克服日志中的多样性时遇到了一些困难:

  1. 每行可以有两条日志
  2. 日志中可能有#

为了解决这些问题,我试着实现一个非贪婪的per,然后是正面的展望,但现在我只能选择第一个项目,并且只有在连续两个项目的情况下才能选择。

https://regexr.com/611kh

代码语言:javascript
复制
\[[^\[\|]*\|[^\]]*\](.*?)(?=\[[^\[\|]*\|[^\]]*\])

我认为,理想情况下,这将是我的最初顺序,然后是一个非贪婪的搜索,然后是正面的展望,在我的初始状态或结束线。

在上下文中,我正在为角元件中的角电子应用程序做这方面的工作。

如有任何建议,将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-30 17:13:01

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

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

如果断言不为真,则.*?非贪婪部分就足以匹配0字符。

您可以做的是添加一个替换|,它尽可能地与字符匹配,直到遇到另一个日志启动或字符串结束为止。

代码语言:javascript
复制
\[[^\[\|]*\|[^\]]*\](.*?)(?=\[[^\[\|]*\|[^\]]*\]|$)

Regex演示

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

代码语言:javascript
复制
(\[[^\[\|]*\|[^\]]*\])\s*(.*?)(?=\[[^\[\|]*\|[^\]]*\]|$)

Regex演示

票数 1
EN

Stack Overflow用户

发布于 2021-06-30 17:25:41

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

首先,在开始新日志条目的模式上拆分(/(?=\[\d+\|)/工作得很好),然后在]上分割行的其余部分,在|再分割一次。

代码语言:javascript
复制
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);

给出

代码语言:javascript
复制
[
  ["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"]
]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68198651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档