Java 正则表达式可以得到一切

Java 正则表达式可以得到一切,java,regex,Java,Regex,我想打印Servlet失败后的所有堆栈跟踪,异常为java.lang.NullPointerException。我还使用了.contains(“Servlet异常失败”) 但这并不总是有效的,因为很少有NPE没有堆栈跟踪。请帮忙 public class PatternMatching { public static final String EXAMPLE_TEST = "<Jul 5, 2017 4:14:28 PM GMT> <Error> <HTTP

我想打印
Servlet失败后的所有堆栈跟踪,异常为java.lang.NullPointerException
。我还使用了
.contains(“Servlet异常失败”)
但这并不总是有效的,因为很少有NPE没有堆栈跟踪。请帮忙

public class PatternMatching {
    public static final String EXAMPLE_TEST = "<Jul 5, 2017 4:14:28 PM GMT> <Error> <HTTP> <BEA-101020> <[ServletContext@1215989071[app:CeCBS module:/shop path:/shop spec-version:2.5]] "+
    "Servlet failed with Exception" +
    "java.lang.NullPointerException" +
    "at xyz.commerce.catalog.CatalogAccessTools.findLeadItemByBundleSku(CatalogAccessTools.java:770)" +
    "at xyz.commerce.catalog.PerformanceMonitoringUKCatalogAccessTools.findLeadItemByBundleSku(PerformanceMonitoringUKCatalogAccessTools.java:436)"+
    "at xyz.commerce.catalog.CatalogAccessTools.findLeadItemByBundleSku(CatalogAccessTools.java:760)"+
    "at xyz.commerce.catalog.PerformanceMonitoringUKCatalogAccessTools.findLeadItemByBundleSku(PerformanceMonitoringUKCatalogAccessTools.java:426)"+
    "at xyz.commerce.catalog.controller.PlansListingController.setChooseAPlan(PlansListingController.java:1505)"+
    "Truncated. see log file for complete stacktrace " ;

    public static void main(String[] args) {
        String Regex = "^Servlet failed with Exception.*\\bat\\b.*";
        Pattern p = Pattern.compile(Regex);
        Matcher m = p.matcher(EXAMPLE_TEST);


       if(m.find())
       {
           System.out.println("Print succesfull");
           //System.out.println(m.start());
           //System.out.println(matcher);
       }
       else
       {    
           System.out.println("Print unsuccesfull");
       }
    }
}

您可以在
“java.lang.NullPointerException”
上尝试拆分:

这是一种快速而肮脏的方法,似乎能满足您的需求。一种更好但更详细的方法是使用正则表达式提取堆栈跟踪的每一行:

String pattern = "at .*?\\(.*?\\)";
Pattern r = Pattern.compile(pattern, Pattern.DOTALL);
Matcher m = r.matcher(EXAMPLE_TEST);

StringBuilder sb = new StringBuilder("");
while (m.find()) {
    sb.append(m.group(0)).append("\n");
}
System.out.println(sb);

请注意,我将regex模式调整为实际的堆栈跟踪字符串,这可能不是实际解析的内容。更好的模式应该是这样的:

String pattern = "\\bat .*?\\(.*?\\)";

在每行开头的
处匹配
会更安全。

您可以尝试在
上拆分“java.lang.NullPointerException”

这是一种快速而肮脏的方法,似乎能满足您的需求。一种更好但更详细的方法是使用正则表达式提取堆栈跟踪的每一行:

String pattern = "at .*?\\(.*?\\)";
Pattern r = Pattern.compile(pattern, Pattern.DOTALL);
Matcher m = r.matcher(EXAMPLE_TEST);

StringBuilder sb = new StringBuilder("");
while (m.find()) {
    sb.append(m.group(0)).append("\n");
}
System.out.println(sb);

请注意,我将regex模式调整为实际的堆栈跟踪字符串,这可能不是实际解析的内容。更好的模式应该是这样的:

String pattern = "\\bat .*?\\(.*?\\)";

在每行的开头匹配
会更安全。

我认为最重要的是需要知道的是,您需要使用
模式。DOTALL
参数到
模式。编译
函数以使
匹配换行符。但是,在这种情况下,您可能无法在单词“Servlet”之前使用
^
(我记不清了,所以您可能会弄乱它),因为它可能与行的开头不匹配。除此之外,我个人可能会用一个
\\S+
(注意大写字母“S”)来捕获异常类型,它匹配一组1个或多个非空白字符。总体而言,我建议

String regex = "Servlet failed with Exception\\s+\\S+\\s+(.*)$"
Pattern p = Pattern.compile(regex, Pattern.DOTALL);
运行
m.find()
后,将在matcher对象的匹配组1中找到有关错误的数据


我要指出的是,这在您的示例中不起作用,因为在几个串联字符串之间不包含空格,但是它应该在实际输出上工作。

我认为最重要的是需要知道的是,您需要使用
模式。将
参数DOTALL
添加到
模式。编译
函数,以便
匹配换行符。但是,在这种情况下,您可能无法在单词“Servlet”之前使用
^
(我记不清了,所以您可能会弄乱它),因为它可能与行的开头不匹配。除此之外,我个人可能会用一个
\\S+
(注意大写字母“S”)来捕获异常类型,它匹配一组1个或多个非空白字符。总体而言,我建议

String regex = "Servlet failed with Exception\\s+\\S+\\s+(.*)$"
Pattern p = Pattern.compile(regex, Pattern.DOTALL);
运行
m.find()
后,将在matcher对象的匹配组1中找到有关错误的数据


我要指出的是,这在您的示例中不起作用,因为在几个串联字符串之间不包含空格,但它应该在实际输出中起作用。

我建议这样做:

Servlet failed with Exception(.|\\n)+
(.|\\n)+
用于新行和更多字符或任何字符


我建议这样做:

Servlet failed with Exception(.|\\n)+
(.|\\n)+
用于新行和更多字符或任何字符


您的问题是什么?在什么和什么之间?已编辑。我想在Servlet出现异常java.lang.NullPointerException失败后打印所有堆栈跟踪,您的实际stacktrace中可能有新行或其他空白,而硬编码字符串中没有。在
Servlet失败后,任何可能读取所有内容的正则表达式都会出现异常java.lang.NullPointerException
您的问题是什么?在什么和什么之间?编辑。我想在Servlet出现异常java.lang.NullPointerException失败后打印所有堆栈跟踪,实际的stacktrace中可能有新行或其他空白,而硬编码字符串中没有。任何在
Servlet之后可以读取所有内容的正则表达式都失败,出现异常java.lang.NullPointerException
上述模式
“\\bat.*?\(.?\)”
打印“at”之后的所有内容。我对此感到高兴。但是我希望
Servlet失败,出现异常java.lang.NullPointerException
这一点,然后打印堆栈跟踪。@self.Fool我不想在这一点上更改我的答案。也许您可以断言出现空指针异常,然后使用我的答案来标识堆栈跟踪的其余部分?我将其修改为
at(.*)\.(.*)\\([^:]*):?([\\d]*)\\)
,它提供了堆栈跟踪中的类名和行号。非常感谢。上面的模式
“\\bat.*?\(.*?\)”
打印“at”之后的所有内容。我对此感到高兴。但是我希望
Servlet失败,出现异常java.lang.NullPointerException
这一点,然后打印堆栈跟踪。@self.Fool我不想在这一点上更改我的答案。也许您可以断言出现空指针异常,然后使用我的答案来标识堆栈跟踪的其余部分?我将其修改为
at(.*)\.(.*)\\([^:]*):?([\\d]*)\\)
,它提供了堆栈跟踪中的类名和行号。多谢。