Regex 如何编写正则表达式从堆栈下面提取行

Regex 如何编写正则表达式从堆栈下面提取行,regex,Regex,如何编写正则表达式从堆栈下面提取行 我不熟悉正则表达式,希望从堆栈下面提取行。以下是规则 异常后提取以“at”开头的第一行 获取以at com.test开头的第一行(该行可选,也可能不在整个文件中) 获取以at com.test开头的行,该行与步骤2 com不同。测试行包(该行可选,可能存在于整个文件中,也可能不存在) 部分使用前瞻性进行了尝试,但没有结果 (例外)。*[\n\r]*.*at\s+(((?*)(*。(?*)(*。((?:)*).(((?:\d+))(((?=(\n.*)at\s+

如何编写正则表达式从堆栈下面提取行

我不熟悉正则表达式,希望从堆栈下面提取行。以下是规则

  • 异常后提取以“at”开头的第一行
  • 获取以at com.test开头的第一行(该行可选,也可能不在整个文件中)
  • 获取以at com.test开头的行,该行与步骤2 com不同。测试行包(该行可选,可能存在于整个文件中,也可能不存在)
  • 部分使用前瞻性进行了尝试,但没有结果

    (例外)。*[\n\r]*.*at\s+(((?*)(*。(?*)(*。((?:)*).(((?:\d+))(((?=(\n.*)at\s+((?(com.test.*)((?(*)[\(?)((:::)))(((:::))))[124;)

    输入

    非法辩论例外

    at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640)
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
    at com.test.package1.user1.client1.client1.Call.invoke(Call.java:90)
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438)
    at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671)
    at com.test.package1.user1.client1.client1.Call.invoke(SrvCall.java:84)
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.test.package2.user2.client2.client2.Call.invoke(Call.java:90)
    at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2640)
    at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2604)
    at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2438)
    at org.eclipse.ui.internal.Workbench$7.run(Workbench.java:671)
    
    预期结果 1.org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)

    2.com.test.package1.user.client.client1.Call.invoke(Call.java:90)

    3.com.test.package2.user2.client2.client2.Call.invoke(Call.java:90)

    您可以使用

    IllegalArgumentException\n\s*at\s+(.+)(?:(?:\n\s*at(?!\s*com\.test).*)*(?:\n\s*at\s+((com\.test[^(\n]*).*)(?:\n\s*at.*)*\n\s*at\s+(?!\3)(com\.test.*))?)?
    

    详细信息

    • IllegalArgumentException
      -字符串
    • \n\s*
      -换行符和0+空格
    • at\s+
      -
      at
      和1+空格
    • (.+)
      -第1组:第行的第一个
    • (?:\n\s*at(?!\s*com\.test)。*)*
      -在
      at
      之后没有
      test.com
      的以缩进
      开头的行
    • \n\s*at\s+
      -以缩进的
      at
      和1+空格开头的行
    • ((com\.test[^(\n]*).*)
      -第2组:
      com.test
      被抓进第三组
    • (?:\n\s*at.*)
      -0行或更多行以
      at开始
    • \n\s*at\s+(?!\3)
      -换行符,1+空格,
      at
      ,1+空格,后面不能有第3组中的文本
    • (com\.test.*)
      -第4组:
      com.test
      和该行的其余部分

    感谢您的快速响应。即使日志文件中没有com.test行,这个正则表达式也应该可以工作。但是如果您从日志文件中删除com.test行,上面的正则表达式就不能工作。@intu将整个部分设置为可选。在第二个匹配中,可以看到这一行com.test.package3.user3.client3.client3.Call.invoke(Call.java:90)但是会一直持续到最后,找到这个com.test.package2.user2.client2.client2.Call.invoke(Call.java:90)@intu让它变懒。你的问题中没有这些细节。你可以自己调整模式,如果你需要最左边的匹配项,可以使部分模式不贪婪……这就是我所期望的……你救了我一整天。谢谢