#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'е.
Комментариев нет:
Отправить комментарий