java - 匹配后获取后续行,直到行与其他模式匹配

标签 java regex

故事 - 从日志文件中提取信息 - 在本例中为 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

最佳答案

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

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

请参阅regex demo

详细信息

  • (?:\G(?!\A)|\[WARNING] Javadoc 警告) - [WARNING] Javadoc 警告 子字符串 (\[警告] Javadoc 警告) 或 (|) 上一个成功匹配的结尾 (\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)); 
} 

关于java - 匹配后获取后续行,直到行与其他模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46911304/

相关文章:

regex - 是否可以使用正则表达式来驼峰化/下划线字符串?

ruby - 匹配ruby中的正则表达式

c++ - Boost::Regex 在长表达式不匹配时抛出错误

javascript - 匹配多个值并将重复值替换为一个值

javascript - 由 1 到 4 个非零数字字符或 1 到 4 个非零数字字符和 1 个字母组成的字符串的正则表达式

java - 为什么 NoUniqueBeanDefinitionException : No qualifying bean of type is defined: expected single matching bean but found 2

java - 使用 Servlet 读取 Jar 内的 list 文件

java - 如何使用 AutoIt 将 Unicode 字符转换为 ANSI?

java - 从 PHP 访问 java 应用程序

java - 如何在 Java 7 中使用方法句柄类调用底层 void 方法?