2011-03-12 89 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");