java - 正则表达式来获取一切

标签 java regex

我想在 Servlet 因 Exception java.lang.NullPointerException 失败后打印所有堆栈跟踪。我还使用了 .contains("Servlet failed with Exception") 但这并不总是有效,因为很少有 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");
       }
    }
}

它应该只打印唯一的堆栈跟踪

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)

最佳答案

我认为最重要的是要知道您需要使用 Pattern.DOTALL 参数到 Pattern.Compile 函数,以便 . 匹配换行符。但是,在那种情况下,您可能无法在“Servlet”一词之前使用 ^(我记不太清了,所以您可以随意使用),因为它可能不匹配该行的开头。除此之外,我个人可能会使用 \\S+(注意大写的“S”)来捕获 Exception 类型,它匹配一组 1 个或多个非空白字符。总的来说,我建议

String regex = "Servlet failed with Exception\\s+\\S+\\s+(.*)$"
Pattern p = Pattern.compile(regex, Pattern.DOTALL);

在运行 m.find() 后,您的错误数据将在匹配器对象的匹配组 1 中找到。

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

关于java - 正则表达式来获取一切,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45509337/

相关文章:

java - 为什么 x == (x = y) 与 (x = y) == x 不一样?

java - 超图数据库 : How to traverse all links between 2 atoms?

javascript - 检查字符串是否包含另一个字符串的 3 个字符长的子字符串

javascript - 使用正则表达式在 $ 符号之前获取数字

正则表达式负向先行识别 url

java - 如何用java读取来自雅虎的未读电子邮件

java - 如何使用 JAX-RS 转发请求?

java - 在java中从HTTPS下载

python - 在 Python 正则表达式中找出捕获组的数量

php - 为什么 PHP 正则表达式中有 {m} 的非贪婪版本?