如何编写正则表达式以从堆栈下方提取行
我是regex的新手,想从堆栈下面提取行。以下是规则
部分先行尝试,但没有结果。
(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)
答案 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
和该行的其余部分。