2016-01-14 56 views
1

我有一個下面的正則表達式,我在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

回答

2

您需要使用負回顧後和組模式:

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

regex demo

(?<!-\p{Zs}*)回顧後無法匹配,如果save/delete一些在-之後,零個或多個空格(如果必須有b,則使用+至少一個)。我用\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+"; 
相關問題