Как я могу получить последние четыре символа из строки в C #? - PullRequest
273 голосов
/ 20 июня 2011

Предположим, у меня есть строка:

string mystring = "34234234d124";

Я хочу получить последние четыре символа этой строки, которые равны "d124".Я могу использовать SubString, но для этого требуется пара строк кода.

Можно ли получить этот результат в одном выражении с помощью C #?

Ответы [ 18 ]

6 голосов
/ 22 июня 2013

По сравнению с некоторыми предыдущими ответами основное отличие состоит в том, что этот фрагмент кода учитывается, когда входная строка:

  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;
    }
}
6 голосов
/ 20 июня 2011

Это просто так:

int count = 4;
string sub = mystring.Substring(mystring.Length - count, count);
3 голосов
/ 02 января 2017

Определение:

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

Использование:

GetLast("string of", 2);

Результат:

из

3 голосов
/ 20 июня 2011

Это не приведет к ошибке для любой строки длины.

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

Вероятно, это избыточное решение для текущей задачи, но если требуется дополнительная проверка, ее можно добавить в регулярное выражение..

Редактировать: Я думаю, это регулярное выражение будет более эффективным:

@".{4}\Z"
3 голосов
/ 20 июня 2011

Используйте общий Last<T>. Это будет работать с ЛЮБОЙ IEnumerable, включая строку.

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 голос
/ 04 октября 2016

при условии, что вы хотите, чтобы строки находились между строкой, которая находится в 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);
1 голос
/ 19 февраля 2015
string var = "12345678";

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

// result = "5678"
1 голос
/ 17 июля 2014

Я собрал некоторый код, модифицированный из различных источников, который получит желаемые результаты, и, кроме того, сделает намного больше. Я допустил отрицательные значения 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"

Надеюсь, эта версия кому-нибудь пригодится. Он работает как обычно, если вы не используете отрицательные числа, и предоставляет значения по умолчанию для параметров вне диапазона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...