gpt4 book ai didi

java - 正则表达式标记日志行

转载 作者:行者123 更新时间:2023-12-04 02:27:19 26 4
gpt4 key购买 nike

我的日志行如下:

[2021-03-10 00:13:32.901] [DefaultDispatcher-worker-2 @coroutine#3] [DEBUG] [4231c006d9083a302fce59d5f0957226] [42c5ac3c0acfc68d] [GreeterImpl] Hello John

[] 中的 6 个文本 block 然后剩下的。我正在寻找一个正则表达式来提取 [] 中的文本, 也在最后。 [] 中的文本 block 可以为空。

我试过了 (?:\[([^\[\]]*)\])+([^\[\]]+)但它只匹配 [] 中的第一个 block .我也试过 (?:(?<=\[)[^\[\]]*(?=\]))+([^\[\]]+)但这与任何内容都不匹配。

FWIW,正则表达式将在 Java 中实现。

最佳答案

简短的编辑:这个稍微简单的正则表达式也可以工作:

(?:(?<=\[)[^\[\]]*)|(?:(?<=\])[^\[\]]*$)

我从你自己的评论中提取了它。

原始答案如下。

长话短说

(?:(?<=^\[| \[)[^\[\]]*)|(?:(?<=\] )[^\[\]]*$)

说明:有两部分用|“或”分隔。

  1. 第一部分,(?:(?<=^\[| \[)[^\[\]]*) 匹配方括号内的内容。接近末尾的 [^\[\]]* 匹配既不是 [ 也不是 ] 的最长可能字符。 (?<=^\[| \[) 要求它之前是字符串的开头和 [ [ 。最后,我将整个内容放入一个非捕获组中,以确保 lookbehind 优先于 |
  2. 第二部分 (?:(?<=\] )[^\[\]]*$) 匹配日志行末尾方括号外的内容(示例中为 Hello John)。这次非括号的运行必须在 ] 之前,然后是行尾。

实际操作:

  1. On regex101 我在哪里建的

  2. 在 Java 中:

    String logLine = "[2021-03-10 00:13:32.901]"
    + " [DefaultDispatcher-worker-2 @coroutine#3] [DEBUG]"
    + " [4231c006d9083a302fce59d5f0957226] [42c5ac3c0acfc68d]"
    + " [GreeterImpl] Hello John";

    Matcher m = Pattern
    .compile("(?:(?<=^\\[| \\[)[^\\[\\]]*)|(?:(?<=\\] )[^\\[\\]]*$)")
    .matcher(logLine);
    while (m.find()) {
    System.out.println(m.group());
    }

输出是:

2021-03-10 00:13:32.901
DefaultDispatcher-worker-2 @coroutine#3
DEBUG
4231c006d9083a302fce59d5f0957226
42c5ac3c0acfc68d
GreeterImpl
Hello John

一个不同的想法:String.split()

    String[] tokens = logLine.split("\\] \\[|\\] (?!\\[)");
assert tokens[0].startsWith("[") : logLine;
tokens[0] = tokens[0].substring(1);

for (String token : tokens) {
System.out.println(token);
}

输出与之前相同。

我在 ] [] 处拆分不是,然后是 [(对于最后一个拆分)。它完整​​地保留了第一个 [,所以我必须单独删除它,这不是很好。否则我发现它比其他解决方案更容易理解。

关于java - 正则表达式标记日志行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66556816/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com