2011-03-12 132 views
31

我想:如何從字符串末尾刪除後綴?

  1. 檢查變量,並確定最後的2個字符是「ID」
  2. 如果是的話,將其刪除。

我可以做到這一點,但他們會爆炸,如果有一個「Id」子字符串,而不是結束。是否有一個RemoveFromEnd()方法需要多個字符參數?

if (column.EndsWith("Id")) 
{ 
     //remove last 2 characters 
     column = column.replace("Id", ""); 
} 

我看到this solution:它做到這一點:

column = System.Text.RegularExpressions.Regex.Replace(column, "Id$", ""); 

但它說,它是相當緩慢的,我要運行該代碼的代碼塊中,我想是非常快,所以我想看看是否有更快的解決方案。

+0

只是好奇如何「慢」正則表達式是(一沒有回溯的末端錨應該是快速的)......雖然在這裏子串可能更合適。 OTOH,與正則表達式沒有明確的條件/ EndsWith。 – 2011-03-12 18:46:20

+0

正則表達式在一般情況下應該更快。您是否嘗試過預編譯或將其存儲爲會員以在您的方法中使用它? (以避免每次創建正則表達式的代價) – jdehaan 2011-03-12 18:58:27

+0

[字符串末尾的trim字符串]的可能重複(http://stackoverflow.com/questions/4226657/trim-string-at-the-end-of字符串) – nawfal 2014-01-05 11:20:09

回答

52

String.Substring能做到這一點:

column = column.Substring(0, column.Length - 2); 

你可以用它來推出自己的RemoveFromEnd

public static string RemoveFromEnd(this string s, string suffix) 
{ 
    if (s.EndsWith(suffix)) 
    { 
     return s.Substring(0, s.Length - suffix.Length); 
    } 
    else 
    { 
     return s; 
    } 
} 
+0

我同意這種方法不想使用正則表達式。但是,真的,這怎麼會更快? – DOK 2011-03-12 18:50:18

+0

@DOK:比什麼更快?正則表達式? – Jon 2011-03-12 18:51:10

+0

@DOK:.NET中的字符串操作方法具有很高的性能。對於像這樣的簡單操作,我經常發現它們比正則表達式要快得多。 – 2011-03-12 18:51:34

4

既然你知道了部分的長度刪除,你可以使用Substring

if (column.EndsWith("Id")) 
{  
    column = column.Substring(0, column.Length - 2); 
} 
+0

如果最後兩個字符不是Id,則會錯誤地刪除它們。 – DOK 2011-03-12 18:48:39

+1

@DOK:這當然是要在if塊的內部(而不是在OP中調用'Replace',爲了清晰起見將會添加if-block。 – 2011-03-12 18:49:58

1

試試這個:

if (column.IndexOf("Id") == column.Length-2) { 
    column = column.Substring(0, column.Length-2); 
} 
9

SubString方法的替代方法是使用Regex.ReplaceSystem.Text.RegularExpressions

using System.Text.RegularExpressions; 
... 
column = Regex.Replace(column, @"Id$", String.Empty); 

這種方式使您能夠避免測試,但不知道這是否是一個真正的速度好處:-)。在某些情況下,您至少需要一種替代方法,在這種情況下,您需要一次檢查多件事情。

正則表達式可以編譯和重新利用,以獲得一些性能提升,而是用來通話的靜態方法,可以這樣使用:

// stored as a private member 
private static Regex _checkId = new Regex(@"Id$", RegexOptions.Compiled); 
... 
// inside some method 
column = _checkId.Replace(column, String.Empty); 
+0

您是否曾經編譯過正則表達式和' EndsWith'''Substring'? – Shimmy 2015-11-20 09:59:55

0

夫婦的筆記添加到@喬恩的回答:

您是否想對此案件不敏感?

if (column.ToLower().EndsWith("id")) { column = column.Remove(column.Length - 2); } 

如果ID是字符串中獨特的,需要始終被刪除...

#No if check.... 
column = column.Replace("Id", ""); 

如果它不區分大小寫,只有一次,我還是會用第一檢查時。

+0

+1使用'Remove'方法 – ajukraine 2013-12-03 17:28:12

+0

-1;這失敗了[土耳其測試](http://www.moserware.com/2008/02/does-your-code-pass- turkey-test.html)。對於大多數情況來說,它可能仍然很好(因爲大多數代碼不需要在土耳其語區域運行),但是對於一些讀者來說,這些代碼將被有效地打破。 – 2017-09-11 22:27:18

3

那麼,有可能是一個RemoveFromEnd()方法,如果你寫你自己:

public static string RemoveFromEnd(this string str, string toRemove) 
{ 
    if (str.EndsWith(toRemove)) 
     return str.Substring(0, str.Length - toRemove.Length); 
    else 
     return str; 
} 

你可以使用它,如下所示:

column = column.RemoveFromEnd("Id");