Метод C # для возврата части строки

#c# #.net

#c# #.net

Вопрос:

Я использую c # .net 2.0.

У меня есть строка ниже со мной

 string str = "tcm:0-433-1";
  

Теперь я хочу создать метод на C #, который примет указанную выше строку в качестве входного параметра и вернет "tcm:433-" .

Пожалуйста, предложите наилучший способ для этого!

Комментарии:

1. зачем создавать, когда вы можете использовать существующий?

2. Возвращаемое не является частью исходной строки. Он состоит из нескольких частей.

3. Это позиции или значения, которые вы пытаетесь удалить из первой строки?

4. Каковы критерии поиска по подстроке?

5. Как спрашивает @Abdul — каковы правила для извлечения разных частей и каковы правила для их объединения обратно вместе?

Ответ №1:

 result = Regex.Replace(input, @"^(. :)d-(d -).*$", "$1$2");
  

Объяснение регулярного выражения:

  • ^ -> Начало строки
  • . -> что угодно один или несколько раз
  • (. :) -> первая группировка
  • d- -> цифра, за которой следует тире
  • d -> цифра один или несколько раз
  • $ -> конец строки
  • $1$2 -> первая и вторая группировка

Комментарии:

1. Это своего рода удар кувалдой по гвоздю.

2. 1 для другого правильного решения; однако вам нужно либо использовать литеральную строку (с префиксом @ ), либо экранировать `-символы

Ответ №2:

Обновление: Вот немного безумная идея. Один из возможных способов описания желаемого ввода / вывода (для меня) заключается в следующем: вы хотите взять все, вплоть до : символа включительно, затем пропустить первый - символ, затем снова перейти к следующему - символу.

Обобщая эту идею, я пришел к следующему беспорядку:

 // Awful name, obviously.
public static string TakeSkipTakeEtc(this string source, params char[] tokens)
{
    bool taking = true;

    int startIndex = 0;
    StringBuilder stringBuilder = new StringBuilder();
    foreach (char token in tokens)
    {
        int index = source.IndexOf(token, startIndex);
        if (index == -1)
        {
            if (taking)
            {
                stringBuilder.Append(source.Substring(startIndex));
            }

            return stringBuilder.ToString();
        }

        if (taking)
        {
            int length = index   1 - startIndex;
            stringBuilder.Append(source.Substring(startIndex, length));
        }

        startIndex = index   1;
        taking = !taking;
    }

    return stringBuilder.ToString();
}
  

Этот метод расширения string принимает переменное количество char аргументов, которые он использует для использования в основном одной и той же логики (проходим через A, затем пропускаем через B, затем проходим через C и т.д.) Для любых аргументов.

Так, например:

 Console.WriteLine("tcm:0-433-1".TakeSkipTakeEtc(':', '-', '-'));
  

Вышеуказанные результаты:

 tcm:433-
  

Возможно, это слишком сложное решение вашей проблемы? Скорее всего. Но, эй, это было забавное маленькое испытание (в наши дни я не получаю достаточно таких).


Итак, учитывая ваш конкретный ввод и желаемый результат, вы могли бы сделать что-то вроде:

 return str.Substring(0, 4)   str.Substring(6, 4);
  

Очевидно, что это очень ненадежное решение, которое требует, чтобы его входные данные соответствовали определенному формату (по крайней мере, оно должно быть длиной в 10 символов). Если ваш ввод будет слишком динамичным для такого жесткого подхода, вы могли бы рассмотреть возможность использования string.IndexOf для поиска символов разделения ключа или, возможно, даже Regex класса (yikes!) для достижения желаемого результата.

В этом конкретном случае вы могли бы использовать string.IndexOf , чтобы найти местоположение первого - символа, а затем string.Substring использовать только часть строки с этим индексом.

Ответ №3:

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

 string str = "tcm:0-433-1";

int token1 = str.IndexOf(":");
int token2 = str.IndexOf("-");
int token3 = str.LastIndexOf("-");

if (token1 == -1 || token2 == -1 || token3 == -1)
    throw new YourException("invalid input");

string result = str.Substring(0, token1)   
                str.Substring(token2   1, token3 - token2);
  

Комментарии:

1. 1, если заменить str.Substring(1, token1) на str.Substring(0, token1) 🙂

2. Только что сделал! Была поздняя ночь … 🙂