【问题标题】:How to remove a suffix from end of string?如何从字符串末尾删除后缀?
【发布时间】:2011-07-14 03:57:02
【问题描述】:

我想:

  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$", "");

但它说它很慢,我将在一个代码块中运行这段代码,我希望它非常快,所以我想看看是否有更快的解决方案可用。

【问题讨论】:

  • 只是好奇正则表达式有多“慢”(不带回溯的结束锚应该是 zippy-fast)......尽管在这里子字符串可能更合适。 OTOH,正则表达式没有明确的条件/EndsWith。
  • Regex 在一般情况下应该更快。您是否尝试过预编译或将其存储为成员以在您的方法中使用它? (避免每次创建正则表达式的成本)
  • 你放的 sn-p 会从字符串中删除所有“Id”,如果它有后缀的话,如果输入字符串是“MyIdWrongId”,它将返回“MyWrong”...

标签: c# string .net-3.5


【解决方案1】:

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

【讨论】:

  • 如果您不想使用正则表达式,我同意这种方法。但实际上,这怎么可能更快?
  • @DOK:比什么更快?正则表达式?
  • @DOK:.NET 中的字符串操作方法非常高效。对于像这样的简单操作,我经常发现它们比正则表达式快得多。
  • 考虑正则表达式的启动成本?如果正则表达式对此更快,我会感到非常惊讶。
  • 可以修改为单行返回 s.EndsWith(suffix) 吗? s.Substring(0, s.Length - suffix.Length) : s;
【解决方案2】:

SubString 方法的替代方法是使用来自System.Text.RegularExpressions 的Regex.Replace:

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

【讨论】:

  • 你有没有对编译过的正则表达式和EndsWith-Substring进行比较?
【解决方案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】:

    既然你知道要移除的部分的长度,你可以使用Substring:

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

    【讨论】:

    • 如果最后两个字符不是Id,则会错误删除。
    • @DOK:这当然是为了在 if 块内(而不是在 OP 中调用 Replace。不过为了清楚起见,会添加 if-block。
    【解决方案5】:

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

    你想不区分大小写吗?

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

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

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

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

    【讨论】:

    • -1;这使Turkey Test 失败。在大多数情况下它可能仍然没问题(因为大多数代码从不需要在土耳其语言环境中运行),但对于一些读者来说,这段代码实际上会被破坏。
    【解决方案6】:

    试试这个:

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

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 2023-04-07
      • 1970-01-01
      • 2017-01-06
      • 2011-03-07
      • 1970-01-01
      相关资源
      最近更新 更多