(/[^:" ()]+\..[^: "()]+).*(\d.*?):(\d.*)?.*?((?:warning|error|note): .+)
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)
对你的正则表达式做一些修改,你可以使用它。
(/[^:" ()]+\..[^: "()]+):-?(\d.*?):(\d.*)?.*?((?:warning|error|note): (?:(?![\r\n]{2})[\s\S])+)
^^^ ^^^^^^^^^^^^^^^^^^^^^^^^
我决定使用双换行符(因为这似乎是3行之间的常见分隔符),而不是指望行的结尾来确定匹配的结束。我将专注于解释我添加/修改的部分。
.*
更改为:-?
(?:(?![\r\n]{2})[\s\S])+
匹配以下一次或多次(tempered greedy token)
(?![\r\n]{2})
否定前瞻确保后面的内容不完全是两个换行符[\s\S]
匹配任何字符(包括换行符)