我在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
答案 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+
对于两种替代方案都很常见,因此您可以将组的末尾移至仅包含save
和delete
。
C#:
var rx = @"(?<!-\s*)\b(save|delete)\ssome\b\s\S+";