2

我有这个输出:

---------- snippet start ----------
JUnit version 4.11
I.E
Time: 0.015
There was 1 failure:
1) testPerson(PersonTest)
org.junit.ComparisonFailure: expected:<John[1]> but was:<John[]>
    at org.junit.Assert.assertEquals(Assert.java:115)
    at org.junit.Assert.assertEquals(Assert.java:144)
    at PersonTest.testPerson(PersonTest.java:21)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)

---------- snippet end----------

我只想检索每行开头没有“at”字样的行,但不包括包含“PersonTest.java”字样的行(带有“at”)非常感谢!

4

3 回答 3

2

如果 IDE 的正则表达式引擎支持它,规范的方法是使用否定的前瞻断言:

(?!^\s*at\b)

(我在末尾放了一个单词边界,以防一行以“附加”开头。)

但是,如果 IDE支持环视断言,那么您必须执行类似于 @HamZa 建议的操作。@HamZa 的解决方案有点偏离,因为例如,它还会过滤掉以“as”开头的行。这是正确的:

^\s*([^a\s]|a[^t])

换句话说,在忽略前导空格之后,如果您的第一个字符不是a a,那么您就可以使用了——否则,您只需确保第二个字符不是 a t

现在,这还没有考虑到“附加”案例。添加这个:

^\s*([^a\s]|a[^t]|at\w)

tl; dr这是一个无论如何都应该工作的正则表达式:

^[ \t]*([^a\s]|a[^t]|at[a-zA-Z0-9_])
于 2013-05-31T06:14:38.933 回答
1

如果您不介意组捕获并且不能使用前瞻,则可以使用此正则表达式:

^((\s{4}|\t)*([^a]t|a[^t]|at[^\s]+)|[^\s]+).*

您可以在这里看到它的实际效果。

问题是很难at像那样匹配,因为\s*它将立即重新调整以允许显式的非at字符。例如:

at

不会匹配\s*[^a][^t]但会匹配:

 at
123

1 是第一[^a]场比赛;2是[^t]比赛。并且\s*简单地将其最大匹配减少到 (maximum-1) 个匹配。

所以,这就是为什么你会\s{4}在我的正则表达式中找到防止 operator 回溯的原因*

现在,我曾经[^a]t|a[^t]|at[^\s]+阻止匹配到at,允许其他所有内容并允许一些特定的匹配:

a t
attention

应该匹配,因为没有文字at

于 2013-05-31T06:38:44.757 回答
0

所以,换句话说,你想过滤掉所有的堆栈跟踪行,除了那些关于测试类本身的行,对吧?!

您需要一个支持负前瞻的正则表达式引擎,例如grep支持-P/的GNU --perl-regexp

grep -v -P '^ *at (?!.*PersonTest)' output

这会过滤掉 ( -v) 所有以 开头的行at而不是在该行中跟随的PersonTest所有行。

于 2013-05-31T06:33:47.297 回答