如何从字符串末尾删除后缀?

时间:2011-03-12 18:41:41

标签: c# string .net-3.5

我想:

  1. 检查变量并确定最后2个字符是否为“Id”
  2. 如果是,请将其删除。
  3. 我可以用下面这个来做,但是如果除了结尾之外还有一个“Id”子串,它们会爆炸。是否有一个RemoveFromEnd()方法,它接受多个字符参数?

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

    我看到this solution:这样做:

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

    但它说它很慢,我将在代码块中运行此代码,我希望速度非常快,所以我想看看是否有更快的解决方案。

6 个答案:

答案 0 :(得分:64)

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;
    }
}

答案 1 :(得分:9)

SubString方法的替代方法是使用Regex.Replace中的System.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);

答案 2 :(得分:4)

由于您知道要移除的部件的长度,因此您可以使用Substring

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

答案 3 :(得分: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");

答案 4 :(得分:1)

试试这个:

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

答案 5 :(得分:0)

要添加到@ Jon的答案中的几个注释:

你想不敏感地做这个案子吗?

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

如果ID在字符串中是唯一的,则需要始终删除...

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

如果它不区分大小写并且只在我仍然使用第一次检查时发生。