C#で文字列から最後の4文字を取得するにはどうすればよいですか?


309

文字列があるとします:

"34234234d124"

この文字列の最後の4文字を取得したい"d124"。を使用できますSubStringが、変数の名前付けなど、数行のコードが必要です。

C#で1つの式でこの結果を取得することは可能ですか?


3
4文字未満のときに何が欲しいですか?
agent-j

12
4 > mystring.length ? mystring : mystring.Substring(mystring.length -4);
Jodrell 2013

3
Pythonでは、ソリューションは単純です"hello world"[-4:]。C#の将来のバージョンでそれが簡単になることを願っています。
大佐パニック

@ ColonelPanic、C#8.0でできるようになりました:"hello world"[^4..]:-)
Frode Evensen

回答:


407
mystring.Substring(Math.Max(0, mystring.Length - 4)); //how many lines is this?

正の場合、文字列の長さが4以上であれば、さらに短くなります。

mystring.Substring(mystring.Length - 4);

13
また、mystringが4文字未満の場合は失敗します。
George Duckett、2011年

3
+1は、@ dtbよりもあなたの方が少し読みやすいと思うため
George Duckett

数行のコード(OPが既に知っている)を取得して1行に詰め込むことは、実際には1つの式と同じではありません。
Buh Buh 2011年

1
私はそれが好きです。シンプルでエレガントで最大値をとるので、文字列が0未満の場合でも、インデックスからの例外は発生しません。
Bretticus

+1シンプルで要点は、すべてのベースをカバーしています。Stecyaによって提案された拡張方法も良いですが、一度だけ実行する場合は少しやりすぎです。
Morvael 2014年

205

拡張メソッドを使用できます:

public static class StringExtension
{
    public static string GetLast(this string source, int tail_length)
    {
       if(tail_length >= source.Length)
          return source;
       return source.Substring(source.Length - tail_length);
    }
}

その後、次を呼び出します。

string mystring = "34234234d124";
string res = mystring.GetLast(4);

11
私はこれが好きですが、たぶんそれをLast()と呼ぶでしょう。結局のところ、Substring()はGetSubstring()ではありません。
Bub Buh 2011年

21
LastがLinq拡張機能Last()と衝突するため、Tail()と呼ぶかもしれません。
Craig Curtis

5
「1行よりもはるかに長い」ようにするための+1。行を節約できるため、コードが読めないのはとても煩わしいです。
Fabio Milheiro、2015

2
または、Right()と呼んで、@ RJプログラマの回答に従ってVisualBasicとの一貫性を保ちます(1つの関数だけに別のアセンブリを追加したくありません)。
christutty

3
このソリューションが大好きです。
ルーク

46

あなたがしなければならないすべては..

String result = mystring.Substring(mystring.Length - 4);

2
長さが4未満の場合に例外がスローされるようにする場合はそうではありません...
ミロスMrdovic

45

わかりましたので、これは古い投稿ですが、フレームワークですでに提供されているコードを書き換えているのはなぜですか?

フレームワークDLL「Microsoft.VisualBasic」への参照を追加することをお勧めします

using Microsoft.VisualBasic;
//...

string value = Strings.Right("34234234d124", 4);

8
VB機能を使用する良い時間の例
ブライアンホワイト

3
わたしは、あなたを愛しています。私のプログラミング経験のほとんどはVBなので、私が慣れ親しんでいるすべての関数を使用できることが
わかったの

6
MS.VBを使用することが良い考えかどうか、私には決してわかりません-なぜそれがVisualBasic名前空間に分路されるのですか?TextFieldParser別の例です。これらのユーティリティが奇妙に因数分解されているのはなぜですか?
ルフィン、2014年

6
これが受け入れられるべき答えだと思います。なぜ車輪を再発明するのですか?
ザック2014

2
@Bomboca:MicrosoftがVisual Basicをサポートし続ける限り、それは続くと確信できます。これは4.6リリースに含まれており、開発言語としてのVB.Netのサポートを停止することを計画しているというMSからの明示的または暗示的なものは何も見つかりません。
RJプログラマー

30
string mystring = "34234234d124";
mystring = mystring.Substring(mystring.Length-4)

26

サブストリングの使用は実際には非常に短く、読みやすいです:

 var result = mystring.Substring(mystring.Length - Math.Min(4, mystring.Length));
 // result == "d124"

17

遅延実行が原因で)パフォーマンスが低下してはならない別の方法を次に示します。

new string(mystring.Reverse().Take(4).Reverse().ToArray());

目的のための拡張メソッドmystring.Last(4)は明らかに最もクリーンなソリューションですが、少し手間がかかります。


1
@BrianWhite人々は新年の後で不機嫌ですか?
Konrad Viltersten 2013年

1
素晴らしい解決策。私はそれが好きです。しかし、正しい文字列を取得するために他のリバースを忘れました。new string(mystring.Reverse()。Take(4).Reverse()。ToArray());でなければなりません。
Yuri Morales

ええ、そうです、あなたは正しいです-私のメンタルコンパイラーはそんなに考えていませんでした。悲しいことに、それはそれをさらに悪化させます!:)
Andre Luus 2013年

1
ToArrayのため、遅延実行はありません

1
@BjörnAliGöranssonさん、理解できないと思います。私のポイントは、Reverse().Take(4).Reverse()それぞれが文字列全体を列挙するのではなく、最後のToArray呼び出しでのみ発生するということでした。遅延実行などがなければ、に変換されReverse().ToArray().Take(4).ToArray().Reverse().ToArray()ます。もちろん、これはそれらの拡張が据え置き型であることを想定しています-私はチェックしませんでした。StringコンストラクタはIEnumerableを受け入れないため、その時点で配列に列挙する必要があります。
Andre Luus 16

17

SubstringC#のメソッドを使うだけです。例のために。

string str = "1110000";
string lastFourDigits = str.Substring((str.Length - 4), 4);

結果0000を返します。


7
これは28回ほど回答されており、もう一度追加しましたか?そして、なぜ受け取るだけのものではなく、2つのパラメータのオーバーロードを使用するのstartIndexですか?
アンドリュー

まさに私が必要とする答え。@ Amit Kumawatを共有してくれてありがとう。
ダリル


7
mystring = mystring.Length > 4 ? mystring.Substring(mystring.Length - 4, 4) : mystring;

いいですが、そうでは=なかったと思います=+
dotancohen

1
mystring.Substring(mystring.Length-4、4)は次と同じです:mystring.Substring(mystring.Length-4)
Moe Howard


6

以前のいくつかの回答と比較すると、主な違いは、入力コードが次の場合にこのコードが考慮されることです。

  1. ヌル
  2. 要求された長さよりも長い、または一致している
  3. 要求された長さより短い。

ここにあります:

public static class StringExtensions
{
    public static string Right(this string str, int length)
    {
        return str.Substring(str.Length - length, length);
    }

    public static string MyLast(this string str, int length)
    {
        if (str == null)
            return null;
        else if (str.Length >= length)
            return str.Substring(str.Length - length, length);
        else
            return str;
    }
}

4

定義:

public static string GetLast(string source, int last)
{
     return last >= source.Length ? source : source.Substring(source.Length - last);
}

使用法:

GetLast("string of", 2);

結果:


3

これは、どのような長さの文字列でも失敗しません。

string mystring = "34234234d124";
string last4 = Regex.Match(mystring, "(?!.{5}).*").Value;
// last4 = "d124"
last4 = Regex.Match("d12", "(?!.{5}).*").Value;
// last4 = "d12"

これはおそらく手元のタスクにはやり過ぎですが、追加の検証が必要な場合は、正規表現に追加することができます。

編集: 私はこの正規表現がより効率的だと思います:

@".{4}\Z"

5
間違いなくやりすぎ。私はこれのために単純な文字列メソッドを使い続けます。
2014年

2番目のバリアントは、3文字の引数で呼び出されたときに3文字の文字列を返さないため、負の先読みを使用した最初の独創的なバージョンとは異なります。:-)
avl_sweden 2014

3

一般的なを使用しLast<T>ます。IEnumerable文字列を含むANY で動作します。

public static IEnumerable<T> Last<T>(this IEnumerable<T> enumerable, int nLastElements)
{
    int count = Math.Min(enumerable.Count(), nLastElements);
    for (int i = enumerable.Count() - count; i < enumerable.Count(); i++)
    {
        yield return enumerable.ElementAt(i);
    }
}

そして、文字列のための特定のもの:

public static string Right(this string str, int nLastElements)
{
    return new string(str.Last(nLastElements).ToArray());
}

1
ワオ。やりすぎ。おそらくenumerable.Skip(enumerable.Count()-nLastElements)のようなものですか?
Buh

@BuhBuhにはこれが行き過ぎであることについて同意しません。しかし、私は名前として「右」より「最後」を好む。既存のLast of IEnumerable <T>をオーバーロードすることについて、少しうるさいです。私も一種の「スキップ」に傾いています。
もっともらしく否認

私はこのソリューションが好きです。単純ではありませんが、IEnumerableを学習するときに興味をそそります。
pKarelian 2016

1

さまざまなソースから変更されたいくつかのコードを一緒に投げて、必要な結果が得られるようにしました。負のint値、文字列の長さを超えるint値、および終了インデックスが開始インデックスより小さいことを許可しました。最後のケースでは、メソッドは逆順のサブストリングを返します。コメントはたくさんありますが、不明確なものや気が狂っているものがあれば教えてください。私はこれをいじくり回して、何に使うのか見てみました。

    /// <summary>
    /// Returns characters slices from string between two indexes.
    /// 
    /// If start or end are negative, their indexes will be calculated counting 
    /// back from the end of the source string. 
    /// If the end param is less than the start param, the Slice will return a 
    /// substring in reverse order.
    /// 
    /// <param name="source">String the extension method will operate upon.</param>
    /// <param name="startIndex">Starting index, may be negative.</param>
    /// <param name="endIndex">Ending index, may be negative).</param>
    /// </summary>
    public static string Slice(this string source, int startIndex, int endIndex = int.MaxValue)
    {
        // If startIndex or endIndex exceeds the length of the string they will be set 
        // to zero if negative, or source.Length if positive.
        if (source.ExceedsLength(startIndex)) startIndex = startIndex < 0 ? 0 : source.Length;
        if (source.ExceedsLength(endIndex)) endIndex = endIndex < 0 ? 0 : source.Length;

        // Negative values count back from the end of the source string.
        if (startIndex < 0) startIndex = source.Length + startIndex;
        if (endIndex < 0) endIndex = source.Length + endIndex;         

        // Calculate length of characters to slice from string.
        int length = Math.Abs(endIndex - startIndex);
        // If the endIndex is less than the startIndex, return a reversed substring.
        if (endIndex < startIndex) return source.Substring(endIndex, length).Reverse();

        return source.Substring(startIndex, length);
    }

    /// <summary>
    /// Reverses character order in a string.
    /// </summary>
    /// <param name="source"></param>
    /// <returns>string</returns>
    public static string Reverse(this string source)
    {
        char[] charArray = source.ToCharArray();
        Array.Reverse(charArray);
        return new string(charArray);
    }

    /// <summary>
    /// Verifies that the index is within the range of the string source.
    /// </summary>
    /// <param name="source"></param>
    /// <param name="index"></param>
    /// <returns>bool</returns>
    public static bool ExceedsLength(this string source, int index)
    {
        return Math.Abs(index) > source.Length ? true : false;
    }

したがって、「これは拡張メソッドです」のような文字列がある場合、ここにいくつかの例と期待される結果を示します。

var s = "This is an extension method";
// If you want to slice off end characters, just supply a negative startIndex value
// but no endIndex value (or an endIndex value >= to the source string length).
Console.WriteLine(s.Slice(-5));
// Returns "ethod".
Console.WriteLine(s.Slice(-5, 10));
// Results in a startIndex of 22 (counting 5 back from the end).
// Since that is greater than the endIndex of 10, the result is reversed.
// Returns "m noisnetxe"
Console.WriteLine(s.Slice(2, 15));
// Returns "is is an exte"

うまくいけば、このバージョンは誰かに役立ちます。負の数を使用しない場合は、通常のように動作し、範囲外のパラメーターのデフォルトを提供します。


1
string var = "12345678";

if (var.Length >= 4)
{
    var = var.substring(var.Length - 4, 4)
}

// result = "5678"

1

最後の文字から10文字の位置にある文字列の間に文字列が必要で、必要なのは3文字だけであると仮定します。

まあ言ってみれば StreamSelected = "rtsp://72.142.0.230:80/SMIL-CHAN-273/4CIF-273.stream"

上記で"273"は、データベースクエリで使用するものを抽出する必要があります

        //find the length of the string            
        int streamLen=StreamSelected.Length;

        //now remove all characters except the last 10 characters
        string streamLessTen = StreamSelected.Remove(0,(streamLen - 10));   

        //extract the 3 characters using substring starting from index 0
        //show Result is a TextBox (txtStreamSubs) with 
        txtStreamSubs.Text = streamLessTen.Substring(0, 3);

この質問は、文字列の最後の4文字を明示的に要求します。文字列の途中から物事を抽出することに関連する別の質問に答えているようです。またSubstring、開始点と長さを既に渡せるようになっているのでRemove、最初に最初を削除するのではなく、なぜそれを使用しないのかわからない。
Chris

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.