Get Substring - все до определенного char

Я пытаюсь найти лучший способ получить все до символа в строке. Ниже приведены некоторые примеры строк. Длина строки до - меняется и может быть любой длиной

223232-1.jpg
443-2.jpg
34443553-5.jpg

поэтому мне нужно значение, которое от начального индекса от 0 до правого -. Таким образом, подстроки оказались бы 223232, 443 и 34443553

Ответ 1

Пример Net Fiddle

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("223232-1.jpg".GetUntilOrEmpty());
        Console.WriteLine("443-2.jpg".GetUntilOrEmpty());
        Console.WriteLine("34443553-5.jpg".GetUntilOrEmpty());

        Console.ReadKey();
    }
}

static class Helper
{
    public static string GetUntilOrEmpty(this string text, string stopAt = "-")
    {
        if (!String.IsNullOrWhiteSpace(text))
        {
            int charLocation = text.IndexOf(stopAt, StringComparison.Ordinal);

            if (charLocation > 0)
            {
                return text.Substring(0, charLocation);
            }
        }

        return String.Empty;
    }
}

Ответ 2

Используйте функцию split.

static void Main(string[] args)
{
    string s = "223232-1.jpg";
    Console.WriteLine(s.Split('-')[0]);
    s = "443-2.jpg";
    Console.WriteLine(s.Split('-')[0]);
    s = "34443553-5.jpg";
    Console.WriteLine(s.Split('-')[0]);

Console.ReadKey();
}

Если ваша строка не имеет -, вы получите всю строку.

Ответ 3

String str = "223232-1.jpg"
int index = str.IndexOf('-');
if(index > 0) {
    return str.Substring(0, index)
}

Ответ 4

Вещи немного сдвинулись с начала этого потока.

Теперь вы можете использовать

string.Concat(s.TakeWhile((c) => c != '-'));

Ответ 5

Один из способов сделать это - использовать String.Substring вместе с String.IndexOf:

int index = str.IndexOf('-');
string sub;
if (index >= 0)
{
    sub = str.Substring(0, index);
}
else
{
    sub = ... // handle strings without the dash
}

Начиная с позиции 0, верните весь текст до, но не включая тире.

Ответ 6

Опираясь на BrainCore ответ:

    int index = 0;   
    str = "223232-1.jpg";

    //Assuming we trust str isn't null 
    if (str.Contains('-') == "true")
    {
      int index = str.IndexOf('-');
    }

    if(index > 0) {
        return str.Substring(0, index);
    }
    else {
       return str;
    }

Ответ 7

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

Во-первых, чтобы избежать дополнительной головной боли при переходе к шаблону регулярных выражений - мы могли бы просто использовать функцию для этой цели:

String reStrEnding = Regex.Escape("-");

Я знаю, что это ничего не делает - так как "-" - это то же самое, что и Regex.Escape("=") == "=", но это будет иметь значение, например, если символ @"\".

Затем нам нужно сопоставить от начала строки до конца строки или, альтернативно, если окончание не найдено - тогда ничего не найдено. (Пустой строки)

Regex re = new Regex("^(.*?)" + reStrEnding);

Если ваше приложение критично к производительности - тогда выделите новую строку для нового Regex, если нет - все может быть в одной строке.

И, наконец, сопоставьте строку и извлеките соответствующий шаблон:

String matched = re.Match(str).Groups[1].ToString();

И после этого вы можете написать отдельную функцию, как это было сделано в другом ответе, или написать встроенную лямбда-функцию. Я написал сейчас, используя обе нотации - встроенную лямбда-функцию (не допускает параметр по умолчанию) или отдельный вызов функции.

using System;
using System.Text.RegularExpressions;

static class Helper
{
    public static string GetUntilOrEmpty(this string text, string stopAt = "-")
    {
        return new Regex("^(.*?)" + Regex.Escape(stopAt)).Match(text).Groups[1].Value;
    }
}

class Program
{
    static void Main(string[] args)
    {
        Regex re = new Regex("^(.*?)-");
        Func<String, String> untilSlash = (s) => { return re.Match(s).Groups[1].ToString(); };

        Console.WriteLine(untilSlash("223232-1.jpg"));
        Console.WriteLine(untilSlash("443-2.jpg"));
        Console.WriteLine(untilSlash("34443553-5.jpg"));
        Console.WriteLine(untilSlash("noEnding(will result in empty string)"));
        Console.WriteLine(untilSlash(""));
        // Throws exception: Console.WriteLine(untilSlash(null));

        Console.WriteLine("443-2.jpg".GetUntilOrEmpty());
    }
}

Кстати, изменение шаблона регулярного выражения на "^(.*?)(-|$)" позволит выбрать шаблон до "-" или, если шаблон не был найден, собрать все до конца строки.

Ответ 8

LINQy способ

String.Concat("223232-1.jpg".TakeWhile(c => c! = '-'))

(Но вам нужно проверить на ноль;)