Как вытащить конкретный кусок из строки

230
20 декабря 2017, 19:16

Есть строка с именем файла(например string filename= FI_FILE1_111_1111). Как мне вытащить его префикс до второго нижнего подчеркивания(FI_FILE1_)??

Как нибудь наверное через substring и string.indexOf(но если привязаться к "_" то он возьмет только первую часть), либо через Regex

Answer 1

Ну например так:

var s = "FI_FILE1_111_1111";
var firstIndex = s.IndexOf('_');
var secondIndex = s.IndexOf('_', firstIndex + 1);
var part = s.Substring(0, secondIndex + 1);

При отсутствии нужного количества _ выдаст пустую строку.

Менее эффективно, но короче:

var part = string.Concat(s.Split('_').Take(2).Select(p => p + "_"));

При отсутствии нужного количества _ выдаст пустую строку.

Answer 2

Если важна скорость, самый быстрый вариант

string GetPrefix(string file)
{
    int count = 0;
    for (var i = 0; i < file.Length; i++)
    {
        if (file[i] == '_') count++;
        if (count == 2) return file.Substring(0, i+1);
    }
    return string.Empty;
}

Как проверить

Console.WriteLine(GetPrefix("FI_FILE1_111_1111"));  

Результат

FI_FILE1_
Answer 3

Раз уж были упомянуты регулярки:

string filename = "FI_FILE1_111_1111";
string pattern = "^[^_]+_[^_]+_"; // "^.+?_.+?_"
string result = Regex.Match(filename, pattern).Value;
Answer 4

Еще вариант на Linq:

string s = "FI_FILE1_111_1111";
Console.WriteLine(
    Enumerable.Range(1, s.Length)
              .Select(x => s.Substring(0, x))
              .SkipWhile(ss => ss.Count(c => c == '_') != 2)
              .FirstOrDefault());

Берем входную строку, начинаем отрезать от начала один символ, потом два, потом три и т.д., пока не получится строка содержащая ровно два символа _. Если в строке нету двух символов _ — вернется null. Да, это дичайше неэффективно.

Answer 5

Вот вам ещё один вариант с LINQ.

var s = "FI_FILE1_111_1111";
int count = 0;
var part = new string(s.TakeWhile(c => count < 2 && (c != '_' || ++count > -1)).ToArray());

Не пытайтесь повторить это дома в production'е.

READ ALSO
Как проверить не пустая ли картинка?

Как проверить не пустая ли картинка?

Есть список изображенийСтоит задача определить пустая ли картинка или на ней есть изображение

311
Почему не переключается песня WMPLib?

Почему не переключается песня WMPLib?

Функция, когда заканчивается песня (Сase 8 ' MediaEnded из MSDN), запускает следующую песню, но почему-то когда проигрывает песня, песня меняется, но не проигрывается

274