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! = '-'))
(Но вам нужно проверить на ноль;)