web-dev-qa-db-ja.com

文字列の末尾から接尾辞を削除する方法は?

したい:

  1. 変数を確認し、最後の2文字が「Id」かどうかを判断します
  2. はいの場合、それらを削除します。

以下でこれを行うことができますが、最後以外の「Id」サブストリングがある場合、それらは爆発します。文字数の引数を取るRemoveFromEnd()メソッドはありますか?

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

この解決策 :これはこれを行う:

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

しかし、それはかなり遅いと言い、私は非常に高速にしたいコードブロック内でこのコードを実行するつもりなので、より高速なソリューションが利用可能かどうかを見たかったです。

38
leora

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

SubStringメソッドの代わりに、Regex.Replace from 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);
11
jdehaan

削除するパーツの長さがわかっているため、 Substring を使用できます。

if (column.EndsWith("Id"))
{    
    column = column.Substring(0, column.Length - 2);
}
4
Fredrik Mörk

独自に作成する場合は、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");
3
FarligOpptreden

これを試して:

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

@Jonの回答に追加するいくつかのメモ:

このケースを区別せずに実行しますか?

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

IDが文字列内で一意であり、常に削除する必要がある場合...

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

大文字と小文字が区別されず、一度しか発生しない場合は、最初のチェックを使用します。

0
GrayWizardx