我正在尝试将JBoss日志解析为retreive错误消息等。
这是我使用的模式:
([0-9]+-[0-9]+-[0-9][0-9]) .*? ((?:ERROR .*? .*?|WARN .*? .*?)) (.*? .* (?!at).*? .*\sjava.*)
*\sjava.*
部分应该在下一行中检索NullPointer异常。
当我在http://www.regexplanet.com/simple/上测试它时(选中了UNIX_LINES选项),一切正常。但是,当我在java代码中使用相同的模式时,没有任何东西被输出,我的程序冻结了。
Pattern p = Pattern.compile("([0-9]+-[0-9]+-[0-9][0-9]) .*? ((?:ERROR .*? .*?|WARN .*? .*?)) (.*? .* (?!at).*? .*\\sjava.*)", Pattern.UNIX_LINES);
当我从模式中删除\sjava.*
时,一切也正常。
这是日志文件中的示例:
2011-06-08 03:28:48,408 INFO [STDOUT] (http-exxample.com%2F10.8.238.48-8180-7) 2011-06-08 03:28:48,403 WARN [http-example.com%2F10.8.238.48-8180-7] interceptors.WebFault (WebFault.java:125) - Exception occurred while writing fault.
java.lang.NullPointerException
除了java.lang.NullPinterException
之外,所有内容都在一行中。
java是否需要任何特殊的方法来转义\s
(空格)?
答案 0 :(得分:0)
不 - 您已正确转义\s
。
答案 1 :(得分:0)
你的正则表达式使得非常重的贪婪匹配。我认为你应该对你的各种不那么贪心
.*
根据日志文件的大小,它们往往会占用大量CPU资源......但是,如果没有示例日志,很难说,如何改进正则表达式
答案 2 :(得分:0)
您可能希望零个或多个空格字符。试试\\s*java.*
修改强>: 使用DOTALL模式。
String s = "2011-06-08 03:28:48,403 WARN [http-example.com%2F10.8.238.48-8180-7] interceptors.WebFault (WebFault.java:125) "
+ "- Exception occurred while writing fault."
+ "\n\n java.lang.NullPointerException\n";
System.out.println(s.matches("(?s)([0-9]+-[0-9]+-[0-9][0-9]) .*? "
+ "((?:ERROR .*? .*?|WARN .*? .*?)) (.*? .* (?!at).*? .*\\sjava.*[\n])"));