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

时间:2019-04-22 08:30:41

标签: regex

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

我是regex的新手,想从堆栈下面提取行。以下是规则

  1. 在异常之后提取以'at'开头的第一行
  2. 获取以com.test开头的第一行(整个文件中可能存在也可能不存在此行)
  3. 获取以com.test开头且与步骤2 com不同的行。测试行包(此行可选项可能会或可能不会出现在整个文件中)

部分先行尝试,但没有结果。

(Exception).*[\n\r]*.*at\s+(((?<pack>.*)(.*\.(?<packfunc>.*\..*)\())).*((?<Offset>:\d+))\)(((?=(\n.*)*at\s+((?<pack1>(com.test.*))(.*\.(?<packfunc1>(.*\..*)))[\(]).*(?<ffset1>:\d+)\))|))

输入

IllegalArgumentException

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)

1 个答案:

答案 0 :(得分:1)

您可以使用

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.*))?)?

请参见regex demo

详细信息

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