Làm cách nào để có được bốn ký tự cuối cùng từ một chuỗi trong C #?


309

Giả sử tôi có một chuỗi:

"34234234d124"

Tôi muốn có được bốn ký tự cuối cùng của chuỗi này "d124". Tôi có thể sử dụng SubString, nhưng nó cần một vài dòng mã, bao gồm cả việc đặt tên một biến.

Có thể nhận kết quả này trong một biểu thức với C # không?


3
Bạn muốn gì khi có ít hơn 4 ký tự?
đại lý-j

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

3
Trong Python giải pháp rất đơn giản : "hello world"[-4:]. Tôi hy vọng một phiên bản tương lai của C # sẽ làm cho nó dễ dàng.
Đại tá Panic

@ColonelPanic, bây giờ bạn có thể với C # 8.0 "hello world"[^4..]:-)
Frode Evensen

Câu trả lời:


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

Nếu bạn tích cực, độ dài của chuỗi của bạn ít nhất là 4, thì nó thậm chí còn ngắn hơn:

mystring.Substring(mystring.Length - 4);

13
Ngoài ra, nó sẽ thất bại nếu mystringdài hơn 4 ký tự.
George Duckett

3
+1 vì tôi nghĩ của bạn dễ đọc hơn một chút so với @ dtb's
George Duckett

Lấy một vài dòng mã (mà OP đã biết) và nhồi nhét nó vào một dòng không thực sự giống với một biểu thức.
Buh Buh

1
Tôi thích nó. Đơn giản và thanh lịch và lấy tối đa vì vậy nếu chuỗi của bạn nhỏ hơn 0, bạn sẽ không nhận được ngoại lệ chỉ mục.
Bretticus

+1 đơn giản và đến điểm, bao gồm tất cả các cơ sở. Phương pháp mở rộng được đề xuất bởi Stecya cũng tốt, nhưng sẽ giết hơn một chút nếu bạn chỉ thực hiện một lần.
Morvael

205

Bạn có thể sử dụng một phương thức mở rộng :

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

Và sau đó gọi:

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

11
Tôi thích điều này, nhưng tôi có lẽ sẽ chỉ gọi nó là Last (). Sau khi tất cả Chuỗi con () không phải là GetSubopes ().
Buh Buh

21
Có thể gọi nó là Tail () là cuộc đụng độ cuối cùng với phần mở rộng Linq Last ().
Craig Curtis

5
+1 để làm cho nó "dài hơn 1 dòng". Thật khó chịu khi thấy mã không thể đọc được vì tiết kiệm dòng.
Fabio Milheiro

2
Hoặc gọi nó là Right () để thống nhất với VisualBasic theo câu trả lời của Lập trình viên @RJ (Tôi không muốn thêm một hội đồng khác chỉ cho một chức năng).
christutty

3
Tôi thích giải pháp này.
Lu-ca

46

Tât cả nhưng điêu bạn phải lam la..

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

2
Không phải nếu bạn muốn ném ngoại lệ nếu chiều dài nhỏ hơn 4 ...
Milos Mrdovic

45

Ok, vì vậy tôi thấy đây là một bài viết cũ, nhưng tại sao chúng ta lại viết mã đã được cung cấp trong khung?

Tôi muốn đề nghị bạn thêm một tham chiếu đến khung DLL "Microsoft.VisualBasic"

using Microsoft.VisualBasic;
//...

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

8
Một ví dụ hay về thời gian sử dụng chức năng VB
Brian White

3
Tôi mến bạn. Hầu hết kinh nghiệm lập trình của tôi là VB, vì vậy phát hiện ra rằng tôi có thể sử dụng tất cả các chức năng mà tôi rất quen thuộc là tuyệt vời
Ben Strombeck

6
Tôi không bao giờ có thể nhận ra nếu sử dụng MS.VB là một ý tưởng hay - tại sao nó lại được đưa vào VisualBasickhông gian tên? TextFieldParserlà một ví dụ khác. Tại sao các tiện ích này được bao gồm rất kỳ lạ?
ruffin

6
Tôi cảm thấy như thế này nên là câu trả lời được chấp nhận. Tại sao lại phát minh ra bánh xe?
Zack

2
@Bomboca: Chúng tôi có thể yên tâm rằng nó sẽ tiếp tục miễn là Microsoft tiếp tục hỗ trợ Visual Basic. Nó được bao gồm trong bản phát hành 4.6 và tôi không thể tìm thấy bất cứ điều gì rõ ràng hoặc ngụ ý từ MS rằng họ dự định ngừng hỗ trợ VB.Net làm ngôn ngữ phát triển.
Lập trình viên RJ

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

26

Sử dụng chuỗi con thực sự khá ngắn và dễ đọc:

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

17

Đây là một cách khác không nên thực hiện quá tệ (vì thực thi bị trì hoãn ):

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

Mặc dù một phương pháp mở rộng cho mục đích mystring.Last(4)rõ ràng là giải pháp sạch nhất, mặc dù công việc nhiều hơn một chút.


1
@BrianWhite Mọi người có cáu kỉnh sau năm mới không?
Konrad Viltersten

1
Giải pháp tốt đẹp. tôi thích nó. Nhưng bạn đã quên Reverse khác để có được chuỗi chính xác. Phải là: chuỗi mới (mystring.Reverse (). Take (4) .Reverse (). ToArray ());
Yuri Morales

Vâng, bạn đã đúng - trình biên dịch tinh thần của tôi đã không nghĩ xa đến vậy. Đáng buồn thay làm cho nó xuất hiện thậm chí còn tồi tệ hơn! :)
Andre Luus

1
Do ToArray không có thực thi bị trì hoãn

1
Tôi không nghĩ bạn hiểu, @ BjornAliGöransson, quan điểm của tôi là Reverse().Take(4).Reverse()mỗi cái không liệt kê toàn bộ chuỗi, nó chỉ xảy ra ở ToArraycuộc gọi cuối cùng . Nếu không có thứ gọi là thực thi hoãn lại, nó sẽ dịch sang Reverse().ToArray().Take(4).ToArray().Reverse().ToArray(). Tất nhiên, điều này giả sử những phần mở rộng đó là loại hoãn lại - mà tôi không kiểm tra. Các hàm tạo chuỗi không chấp nhận IEnumerable, vì vậy bạn phải liệt kê nó vào một mảng tại thời điểm đó.
Andre Luus

17

Bạn chỉ có thể sử dụng Substringphương pháp của C #. Dành cho người cũ

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

Nó sẽ trả về kết quả 0000.


7
Điều này đã được trả lời như 28 lần và bạn đã thêm nó một lần nữa? Và tại sao sử dụng quá tải hai tham số thay vì chỉ nhận được startIndex?
Andrew

Chính xác là câu trả lời tôi cần. Cảm ơn đã chia sẻ @Amit Kumawat.
Daryl

12

Một giải pháp đơn giản sẽ là:

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

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

Đẹp, nhưng tôi nghĩ rằng bạn có nghĩa là =không =+.
dotancohen

1
mystring.Subopes (mystring.Lipse - 4, 4) giống như: mystring.Subopes (mystring.Lipse - 4)
Moe Howard

6

Nó chỉ là thế này:

int count = 4;
string sub = mystring.Substring(mystring.Length - count, count);

6

So với một số câu trả lời trước, điểm khác biệt chính là đoạn mã này được xem xét khi chuỗi đầu vào là:

  1. Vô giá trị
  2. Dài hơn hoặc khớp với độ dài yêu cầu
  3. Ngắn hơn chiều dài yêu cầu.

Đây là:

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

Định nghĩa:

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

Sử dụng:

GetLast("string of", 2);

Kết quả:

của


3

Điều này sẽ không thất bại cho bất kỳ chuỗi độ dài.

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

Điều này có thể là quá mức cần thiết cho nhiệm vụ trong tay, nhưng nếu cần phải xác nhận bổ sung, nó có thể có thể được thêm vào biểu thức thông thường.

Chỉnh sửa: Tôi nghĩ rằng regex này sẽ hiệu quả hơn:

@".{4}\Z"

5
Chắc chắn là quá mức cần thiết. Tôi sẽ gắn bó với các phương pháp chuỗi đơn giản cho việc này.
sóng thần

Biến thể thứ hai không trả về chuỗi ba chữ cái khi được gọi với đối số ba chữ cái, vì vậy nó không tương đương với phiên bản khéo léo đầu tiên của bạn bằng cách sử dụng giao diện phủ định! :-)
avl_sweden

3

Sử dụng chung chung Last<T>. Điều đó sẽ làm việc với BẤT K IEnumerable,, bao gồm cả chuỗi.

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

Và một cụ thể cho chuỗi:

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

1
Ồ Quá mức cần thiết. Có lẽ một cái gì đó giống như liệt kê.Skip (enumerable.Count () - nLastElements)?
Buh Buh

Tôi không đồng ý với @BuhBuh về việc này là quá mức cần thiết. Nhưng tôi thích "Cuối cùng" hơn "Phải" như một cái tên. Tôi hơi khó hiểu về việc quá tải phần cuối cùng của IEnumerable <T>. Tôi cũng đang nghiêng về "Bỏ qua".
Bị từ chối hợp pháp

Tôi thích giải pháp này. Không đơn giản nhưng quan tâm khi học IEnumerable.
pKarelian

1

Tôi đã tập hợp một số mã được sửa đổi từ nhiều nguồn khác nhau sẽ nhận được kết quả bạn muốn và làm nhiều hơn thế nữa. Tôi đã cho phép các giá trị int âm, các giá trị int vượt quá độ dài của chuỗi và cho chỉ mục kết thúc nhỏ hơn chỉ mục bắt đầu. Trong trường hợp cuối cùng đó, phương thức trả về một chuỗi con thứ tự ngược. Có rất nhiều ý kiến, nhưng hãy cho tôi biết nếu có gì không rõ ràng hoặc chỉ là điên rồ. Tôi đã chơi xung quanh với điều này để xem tất cả những gì tôi có thể sử dụng nó cho.

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

Vì vậy, nếu bạn có một chuỗi như "Đây là một phương thức mở rộng", đây là một số ví dụ và kết quả mong đợi.

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"

Hy vọng phiên bản này hữu ích cho ai đó. Nó hoạt động giống như bình thường nếu bạn không sử dụng bất kỳ số âm nào và cung cấp mặc định cho các thông số ngoài phạm vi.


1
string var = "12345678";

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

// result = "5678"

1

giả sử bạn muốn các chuỗi ở giữa một chuỗi nằm ở 10 ký tự từ ký tự cuối cùng và bạn chỉ cần 3 ký tự.

Hãy cùng nói nào StreamSelected = "rtsp://72.142.0.230:80/SMIL-CHAN-273/4CIF-273.stream"

Ở trên, tôi cần trích xuất cái "273"mà tôi sẽ sử dụng trong truy vấn cơ sở dữ liệu

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

Câu hỏi này yêu cầu rõ ràng cho bốn ký tự cuối cùng trong chuỗi. Bạn dường như đang trả lời một câu hỏi khác liên quan đến việc trích xuất mọi thứ từ giữa chuỗi. Cũng Substringđã cho phép bạn vượt qua điểm bắt đầu và độ dài, vì vậy không chắc chắn lý do tại sao bạn không sử dụng điều đó thay vì sử dụng Removeđể xóa phần đầu tiên.
Chris

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.