我试图将JBoss日志解析为撤回错误消息等等。这是我使用的模式:([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 (白空间)?
发布于 2011-06-10 11:32:37
不-你逃过了\s。
发布于 2011-06-10 11:37:32
您的正则表达式会产生非常重的贪婪匹配。我觉得你应该少一点贪得无厌
.*取决于日志文件的大小,它们往往是CPU密集型的.但是,如果没有示例日志,很难确定如何改进正则表达式
发布于 2011-06-10 11:41:10
您可能期望为零或更多空格字符。试试\\s*java.*
编辑:使用多特雷模式。
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])"));https://stackoverflow.com/questions/6305694
复制相似问题