首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正则表达式来获取所有内容

正则表达式来获取所有内容
EN

Stack Overflow用户
提问于 2017-08-04 22:26:28
回答 3查看 115关注 0票数 2

我想在Servlet failed with Exception java.lang.NullPointerException之后打印所有堆栈跟踪。我也使用了.contains("Servlet failed with Exception"),但这并不总是有效的,因为很少的NPE没有堆栈跟踪。请帮帮我!!

代码语言:javascript
复制
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");
       }
    }
}

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

代码语言:javascript
复制
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)
EN

回答 3

Stack Overflow用户

发布于 2017-08-04 23:10:36

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

代码语言:javascript
复制
String regex = "Servlet failed with Exception\\s+\\S+\\s+(.*)$"
Pattern p = Pattern.compile(regex, Pattern.DOTALL);

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

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

票数 0
EN

Stack Overflow用户

发布于 2017-08-04 23:26:50

我建议这样做:

代码语言:javascript
复制
Servlet failed with Exception(.|\\n)+

用于新行和更多字符或任意字符的(.|\\n)+

demo

票数 0
EN

Stack Overflow用户

发布于 2017-08-04 22:34:18

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

代码语言:javascript
复制
String whatYouWant = EXAMPLE_TEST.split("java\\.lang\\.NullPointerException")[1];

Demo

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

代码语言:javascript
复制
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);

Demo

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

代码语言:javascript
复制
String pattern = "\\bat .*?\\(.*?\\)";

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45509337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档