如何为包含多行的组的正则表达式执行多个查找?

时间:2017-11-16 14:03:53

标签: java regex

  • 平台: Java
  • 当前模式: (/[^:" ()]+\..[^: "()]+).*(\d.*?):(\d.*)?.*?((?:warning|error|note): .+)
  • 问题:对于第4组,它只匹配到行尾。如果我添加DOTALL,它只会找到一组具有最后一次查找描述的组。

我希望找到匹配项的输入 - 进入pattern.compile(String)的输入:

Build failed: Command failed with exit code 1.
stderr: /sample/path/to/SampleFile.java:1: error: [PackageLocation] Expected package /sample/path/to/ to be declared in a directory ending with /sample/path/to, instead found /sample/path/To
package sample.path.to;
                   ^
    (see http://errorprone.info/bugpattern/PackageLocation)
/sample/path/to/SampleFile2.java:-1: note: Some input files use or override a deprecated API.

/sample/path/to/SampleFile2.java:-1:6 note: Recompile with -Xlint:deprecation for details.

预期输出:

找0

  • 第1组: /sample/path/to/SampleFile.java
  • 第2组: 1
  • 第3组: null
  • 第4组:错误:[PackageLocation]在/ sample / path / to结尾的目录中声明的package / sample / path / to / to,而不是找到/ sample / path / To ;                ^ (见http://errorprone.info/bugpattern/PackageLocation

查找1

  • 第1组: /sample/path/to/SampleFile2.java
  • 第2组: 1
  • 第3组: null
  • 第4组:注意:某些输入文件使用或覆盖已弃用的API。

查找2

  • 第1组: /sample/path/to/SampleFile2.java
  • 第2组: 1
  • 第3组: 6
  • 第4组:注意:使用-Xlint重新编译:弃用以获取详细信息。

1 个答案:

答案 0 :(得分:1)

代码

对你的正则表达式做一些修改,你可以使用它。

See regex in use here

(/[^:" ()]+\..[^: "()]+):-?(\d.*?):(\d.*)?.*?((?:warning|error|note): (?:(?![\r\n]{2})[\s\S])+)
                        ^^^                                           ^^^^^^^^^^^^^^^^^^^^^^^^

说明

我决定使用双换行符(因为这似乎是3行之间的常见分隔符),而不是指望行的结尾来确定匹配的结束。我将专注于解释我添加/修改的部分。

  1. 我将.*更改为:-?
    • 虽然这可能是一个很小的改变,但它可能会帮助你在将来不会捕获字符串中不正确的部分。
  2. (?:(?![\r\n]{2})[\s\S])+匹配以下一次或多次(tempered greedy token
    • (?![\r\n]{2})否定前瞻确保后面的内容不完全是两个换行符
    • [\s\S]匹配任何字符(包括换行符)