正则表达式匹配某些字符串并忽略它是否以某种模式开头

时间:2016-01-14 12:12:59

标签: c# regex

我在C#代码中使用了以下正则表达式,它尝试匹配save some后跟一些单词和delete some后跟文件中的某个单词。

\bsave\ssome\b\s[^\s]+|\bdelete\ssome\b\s[^\s]+

这可以按预期工作。现在,我想要排除那些具有- save some- delete some模式的匹配项。

我尝试使用以下内容,但它无效。在下面的表达式中,我只是使用表达式忽略- save some感谢任何帮助。 (?!-\s\bsave\ssome\b\s[^\s])(\bsave\ssome\b\s[^\s]+|\bdelete\ssome\b\s[^\s]+)

演示版为here

1 个答案:

答案 0 :(得分:2)

您需要使用负面的后视并对模式进行分组:

(?<!-\p{Zs}*)(?:\bsave\ssome\b\s[^\s]+|\bdelete\ssome\b\s[^\s]+)
^^^^^^^^^^^^  ^                                                ^  

请参阅regex demo

如果(?<!-\p{Zs}*)部分前面有save/delete后跟零个或多个空格,- lookbehind会失败,如果必须至少有一个,请使用+ 。我使用\p{Zs}仅匹配水平空格。如果您想匹配换行符,请使用\s

合同规范的正则表达式版本:

(?<!-\s*)\b(save|delete)\ssome\b\s\S+

Explicit Capture标记与it一起使用。由于\ssome\b\s\S+对于两种替代方案都很常见,因此您可以将组的末尾移至仅包含savedelete

C#:

var rx = @"(?<!-\s*)\b(save|delete)\ssome\b\s\S+";