2014-11-06 56 views
1

刪除特定字符串我想如果存在正則表達式,如果存在

所以

ABCD => ABCD 
ABCD-L => ABCD 

此刻我正在使用類似的線從我的字符串的末尾刪除-L低於在我的正則表達式中使用if/else類型的排列,但是,我有一種感覺,它應該比這更容易。

var match = Regex.Match("...", @"(?(\S+-L$)\S+(?=-L)|\S+)"); 
+2

和'string.Replace和string.Contains'方法不適合你..? [String.Replace(string,string)](http://msdn.microsoft.com/en-us/library/fk49wtc1(v = vs.110)。aspx) – MethodMan 2014-11-06 02:02:52

+0

這是相當大的正則表達式的一部分,如果我想把它分解成一個C#代碼,它將轉化爲相當數量的行。就這樣。 – Mehrad 2014-11-06 02:05:29

+2

再次爲什麼使用正則表達式,如果你不明白它..使用string.Replace它更容易理解和併入string.Contains方法 – MethodMan 2014-11-06 02:06:20

回答

4

如何只是在做:

Regex rgx = new Regex("-L$"); 
string result = rgx.Replace("ABCD-L", ""); 

所以基本上:如果字符串以-L結束時,替換爲空字符串的一部分。

如果您不僅希望在字符串末尾調用替換,還要在字末尾調用替換,您還可以添加一個額外開關來檢測字符邊界(\b)以及字符串末尾:

Regex rgx = new Regex("-L(\b|$)"); 
string result = rgx.Replace("ABCD-L ABCD ABCD-L", ""); 

請注意,檢測字邊界可能有點模糊。請參閱here以獲取C#中被認爲是單詞字符的字符列表。

+0

只有當'rgx.Sucess'爲'true'時''Replace'是否有效? – Mehrad 2014-11-06 02:02:50

+0

@Mehrad什麼是'rgx.Sucess'?無法在任何地方找到該屬性。無論如何,如果什麼都沒有匹配,什麼都不會被取代。 – 2014-11-06 02:08:39

+0

這就是我的意思。很有用。謝謝。同時,如果你喜歡'var matchL = Regex.Match(...);'你會得到'matchL'的一個屬性,叫做'bool'類型的'Sucess',它表示是否有正則表達式的結果比賽。 – Mehrad 2014-11-06 02:15:35

1

使用Regex.Replace功能,

Regex.Replace(string, @"(\S+?)-L(?=\s|$)", "$1") 

DEMO

說明:

(      group and capture to \1: 
    \S+?      non-whitespace (all but \n, \r, \t, \f, 
          and " ") (1 or more times) 
)      end of \1 
-L      '-L' 
(?=      look ahead to see if there is: 
    \s      whitespace (\n, \r, \t, \f, and " ") 
|      OR 
    $      before an optional \n, and the end of 
          the string 
)      end of look-ahead 
1

您當然可以使用正則表達式這一點,但爲什麼用普通的字符串函數時更清晰?

比較:

text = text.EndsWith("-L") 
    ? text.Substring(0, text.Length - "-L".Length) 
    : text; 

這樣:

text = Regex.Replace(text, @"(\S+?)-L(?=\s|$)", "$1"); 

或者更好的是,像這樣定義一個擴展方法:

public static string RemoveIfEndsWith(this string text, string suffix) 
{ 
    return text.EndsWith(suffix) 
     ? text.Substring(0, text.Length - suffix.Length) 
     : text; 
} 

然後你的代碼可以是這樣的:

text = text.RemoveIfEndsWith("-L"); 

當然,你總是可以使用Regex定義擴展方法。至少你的調用代碼看起來更清晰,並且更具可讀性和可維護性。

+0

您的比較錯誤。你應該將你的解決方案與新的Regex(「 - L $」)進行比較。替換(text,「」);' – 2014-11-06 02:27:21

+0

@RobbyCornelissen - 這段代碼肯定比我用過的正則表達式更好,但它仍然不太明顯到它做什麼。 – Enigmativity 2014-11-06 03:57:17

相關問題