用于匹配不包含某个单词的行的正则表达式

11

我有以下这些代码行:

Message:Polarion commit Mon May 18 06:59:37 CEST 2009
Message:Polarion commit Fri May 15 19:39:45 CEST 2009
Message:424-18: use new variable
Message:Polarion commit Fri May 15 19:29:10 CEST 2009
Message:Polarion commit Fri May 15 19:27:23 CEST 2009
Message:000-00: do something else
Message:Polarion commit Fri May 15 17:50:30 CEST 2009
Message:401-103: added application part
Message:Polarion commit Fri May 15 17:48:46 CEST 2009
Message:Polarion commit Fri May 15 17:42:04 CEST 2009

我想获取所有不包含"Polarion"的行,应该怎么做?

PS: 我看到了这篇文章:Regex to match against something that is not a specific substring,但对我没有帮助

PPS: 我正在尝试在tortoiseSVN中选择日志消息,我认为"negative lookbehind"存在问题


请使用四个空格缩进代码和示例纯文本文件,以确保正确格式化。您可以通过选择文本并按Ctrl-K来执行此操作。干杯。 - Stephan202
并非所有的正则表达式引擎都支持负向后查找,TortoiseSVN很可能就是其中一个不支持的。 - Peter Boughton
6个回答

23

这个表达式将完成任务。

^(?:.(?<!Polarion))*$
它使用零宽度负回顾断言来断言字符串不包含 "Polarion"。以下版本将仅在出现 'n' 之后执行断言,可能会更快,也可能更慢。
^(?:[^n]*|n(?<!Polarion))*$

1
有趣的回答,但是grep -v更简单。 - Trampas Kirk

9

如果您能让正则表达式匹配您要查找的内容,然后再反转结果,可能会更容易。

大多数使用Regex的工具都允许您反转搜索结果,通常将选项称为“v”以表示Vert(保持i不变,表示大小写不敏感):

例如:

grep -v <search>
find /v <search>

etc.


嗯,第一个加粗的文本,在预览中显示反转的 v 很好,但在这里看起来不对... - Ray Hayes
星号不应该在单词内部使用,但是<b>...</b>应该可以工作。这不是我第一次看到预览窗格给出虚假结果了。 - Alan Moore

4

这里有一个解决方案,使用负向先行断言,比后行断言更广泛支持:

^Message:(?!Polarion).*$

(另外,由于我们知道Polarion可能出现在哪里,我们不需要执行Daniel建议的任何无意义的花哨操作。)


以上表达式的解释,以正则表达式注释形式呈现:

(?x)       # Enable comments
^          # Start of string (start of line in multiline mode)
Message:   # Literal text
(?!        # Begin negative lookahead
Polarion   # Literal text
)          # End negative lookahead
.*         # Greedily match any number of any character
$          # End of string (end of line in multiline mode)

0

正如这个答案所展示的,TortoiseSVN的搜索框不仅限于正则表达式。具体而言,如果一个表达式被括在!( )中,它将被否定,并且不匹配的行将显示在结果中。 否定括号内的表达式(无论是正则还是非正则)。

对于您的情况,

!(Polarion)

应该可以解决问题。


0

我找不到有关TortoiseSVN使用哪种正则表达式引擎的任何信息,但您可以在邮件列表上进行咨询。并非所有引擎都支持高级功能,例如零宽度负回顾。


0
这对我很有用,而且输入起来很快(在搜索对话框或类似的地方):^(?!.*not this).*but this

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接