Страницы

Поиск по вопросам

воскресенье, 26 января 2020 г.

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

#c_sharp #строки


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

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


Ответы

Ответ 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 + "_")); При отсутствии нужного количества _ выдаст пустую строку.

Ответ 2



Раз уж были упомянуты регулярки: string filename = "FI_FILE1_111_1111"; string pattern = "^[^_]+_[^_]+_"; // "^.+?_.+?_" string result = Regex.Match(filename, pattern).Value;

Ответ 3



Если важна скорость, самый быстрый вариант 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_

Ответ 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. Да, это дичайше неэффективно.

Ответ 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'е.

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

Отправить комментарий