2013-05-31 14 views
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” 非常感谢!

+0

为什么不使用期望'at'的正则表达式出现在行的开始处,并在正则表达式失败时检索行? – Patashu

+0

你也可以使用'grep',如果你不需要以编程方式做,例如:''grep -v“在'' – rednaw

+0

就像在循环中使用它,我不能这样做AFAIK,我只能使用正则表达式,不能使用编程语言,它是编译后我的IDE输出,我想尽量减少它给出的噪音。无论如何感谢 – 0x726364

回答

2

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

(?!^\s*at\b) 

(我把一个单词边界的尽头有万一符合,说开始,“附件“)。

但是,如果IDE 不支持支持lookaround断言,那么您必须执行类似于@HamZa建议的操作。 @ HamZa的解决方案虽然有点不合适,例如,它也会过滤以“as”开头的行。下面是正确的:

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

换句话说,忽略前导空格后,如果你的第一个字符是a,那么你是好去—否则,你就必须确保第二字符不是t

现在,这并没有考虑到“附加”情况。补充一点:

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

TL;博士下面是应该工作无论什么正则表达式:

^[ \t]*([^a\s]|a[^t]|at[a-zA-Z0-9_]) 
+0

不错的** + 1 **的广泛解释。 – HamZa

0

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

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

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

此过滤掉(-v)所有以at开始不随后在行PersonTest线。

+0

谢谢,是的,这是我想要实现的输出,我试过gnuwin32 grep,但参数似乎不能在我的系统上工作,我有Windows XP,也许不支持'negative lookahead',或者我不知道。另一个如何在Windows中将某些东西变成grep?我认为它期望文件作为输入。非常感谢。 – 0x726364

+0

使用gnuwin32时,必须使用'pcregrep'(并放弃'-P',并使用双引号),或者使用_Cygwin_中的'grep'。 –

+0

对于管道,只需输入filename | grep -v ...';离开'输出'。 –

1

如果你不介意的组捕获并不能使用向前看符号,你可以用这个表达式:

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

你可以看到它在行动here

问题是难以匹配at,因为\s*会立即重新调整以允许明确的非at字符。例如:

at 

不匹配\s*[^a][^t]但将对阵:

at 
123 

1是第一[^a]比赛; 2是[^t]的比赛。和\s*只是将其最大匹配减少到(最大-1)匹配。

所以,这就是为什么你会发现\s{4}在我的正则表达式,以防止运营商*回溯。现在

,我以前[^a]t|a[^t]|at[^\s]+防止火柴at,让一切并允许一些特定的比赛:

a t 
attention 

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

+0

+1。你是绝对正确的;我没有测试我的正则表达式来查看这个错误。我希望你不介意我编辑我的问题来整合你的修复;但我很高兴拿下我的答案。 –

相关问题