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

239
17 декабря 2019, 17:20

Есть строка с именем файла(например 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 filename = "FI_FILE1_111_1111";
string pattern = "^[^_]+_[^_]+_"; // "^.+?_.+?_"
string result = Regex.Match(filename, pattern).Value;
Answer 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_
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
PHP вложенные try catch

PHP вложенные try catch

Как перехватить Exception в функции на уровне выше?

185
ООП php: как добавить middleware?

ООП php: как добавить middleware?

Всем привет! Есть интерфейс IHandler:

209
Почему Laravel меняет хеш пароля в бд?

Почему Laravel меняет хеш пароля в бд?

Перестает авторизировать пользователя спустя несколько дней после регистрацииВ БД все данные остаются

210
Получить данные массива JSON из URL через PHP скрипт

Получить данные массива JSON из URL через PHP скрипт

Есть данные JSON(многомерный массив(больше трех вложенных друг в друга): https://apitrademc

197