【问题标题】:Get proceeding lines after match until lines match other pattern匹配后获取继续行,直到行匹配其他模式
【发布时间】:2017-10-24 13:01:13
【问题描述】:

故事 - 从日志文件中提取信息 - 在这种情况下是 Maven 构建。基本上我想在首先匹配给定模式后获取与模式匹配的所有行。

换句话说,我想匹配所有在[WARNING] Javadoc Warnings 行之后以[WARNING] 开头的行。

我试过用这个:

(?<=\[WARNING\] Javadoc Warnings).*(\r|\n|.)(?=(\[WARNING\].*))

但它只返回下一行。

[WARNING] E:\workspaces\1
[WARNING] E:\workspaces\4

输入:

[WARNING] E:\workspaces\asd
[WARNING] E:\workspaces\dsa

[INFO] 
12 warnings
[WARNING] Javadoc Warnings
[WARNING] E:\workspaces\1
[WARNING] E:\workspaces\2
[WARNING] E:\workspaces\3

[INFO] Building jar: E:\workspaces\asdf
[INFO] 
[INFO] >>> maven-source-plugin:3.0.1:j

[INFO] 
[INFO] <<< maven-source-plugin:3.0.1:j
[INFO] 
12 warnings
[WARNING] Javadoc Warnings
[WARNING] E:\workspaces\4
[WARNING] E:\workspaces\5
[WARNING] E:\workspaces\6
[INFO] Building jar: E:\workspaces\asdf
[INFO] 
[INFO] >>> maven-source-plugin:3.0.1:j
[INFO] 
[INFO] <<< maven-source-plugin:3.0.1:j

想要的结果是

[WARNING] E:\workspaces\1
[WARNING] E:\workspaces\2
[WARNING] E:\workspaces\3
[WARNING] E:\workspaces\4
[WARNING] E:\workspaces\5
[WARNING] E:\workspaces\6

【问题讨论】:

标签: java regex


【解决方案1】:

您可以使用以下解决方案:

(?:\G(?!\A)|\[WARNING] Javadoc Warnings)\R(\[WARNING].*)

regex demo

详情

  • (?:\G(?!\A)|\[WARNING] Javadoc Warnings) - [WARNING] Javadoc Warnings 子字符串 (\[WARNING] Javadoc Warnings) 或 (|) 上一个成功匹配的结束 (\G(?!\A))
  • \R - 换行
  • (\[WARNING].*) - 第 1 组:[WARNING] 子字符串和它后面的任何 0+ 个字符到行尾

online Java demo

String s = "[WARNING] E:\\workspaces\\asd\r\n[WARNING] E:\\workspaces\\dsa\r\n\r\n[INFO] \r\n12 warnings\r\n[WARNING] Javadoc Warnings\r\n[WARNING] E:\\workspaces\\1\r\n[WARNING] E:\\workspaces\\2\r\n[WARNING] E:\\workspaces\\3\r\n\r\n[INFO] Building jar: E:\\workspaces\\asdf\r\n[INFO] \r\n[INFO] >>> maven-source-plugin:3.0.1:j\r\n\r\n[INFO] \r\n[INFO] <<< maven-source-plugin:3.0.1:j\r\n[INFO] \r\n12 warnings\r\n[WARNING] Javadoc Warnings\r\n[WARNING] E:\\workspaces\\4\r\n[WARNING] E:\\workspaces\\5\r\n[WARNING] E:\\workspaces\\6\r\n[INFO] Building jar: E:\\workspaces\\asdf\r\n[INFO] \r\n[INFO] >>> maven-source-plugin:3.0.1:j\r\n[INFO] \r\n[INFO] <<< maven-source-plugin:3.0.1:j";
Pattern pattern = Pattern.compile("(?:\\G(?!\\A)|\\[WARNING] Javadoc Warnings)\\R(\\[WARNING].*)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    System.out.println(matcher.group(1)); 
} 

【讨论】:

  • 完美运行。可能是一个愚蠢的问题 - 是否有理由不转义 ] 字符?
  • @mihail:字符类之外的] 没有特殊含义,无需转义仅以正则表达式模式表示自己的常规字符。反斜杠越少,它造成的混乱就越少。但是如果你对正则表达式没有信心,你可以逃避]
猜你喜欢
  • 1970-01-01
  • 2018-03-24
  • 2011-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-25
  • 2021-04-26
  • 2021-06-16
相关资源
最近更新 更多