Получить строку между двумя строками в строке
У меня есть строка вроде:
"super exemple of string key : text I want to keep - end of my string"
Я хочу просто сохранить строку, которая находится между "key : "
и " - "
. Как я могу это сделать? Должен ли я использовать регулярное выражение или я могу сделать это по-другому?
Ответы
Ответ 1
Возможно, хороший способ - это просто вырезать подстроку:
String St = "super exemple of string key : text I want to keep - end of my string";
int pFrom = St.IndexOf("key : ") + "key : ".Length;
int pTo = St.LastIndexOf(" - ");
String result = St.Substring(pFrom, pTo - pFrom);
Ответ 2
string input = "super exemple of string key : text I want to keep - end of my string";
var match = Regex.Match(input, @"key : (.+?)-").Groups[1].Value;
или только с строковыми операциями
var start = input.IndexOf("key : ") + 6;
var match2 = input.Substring(start, input.IndexOf("-") - start);
Ответ 3
Вы можете сделать это без регулярного выражения
input.Split(new string[] {"key :"},StringSplitOptions.None)[1]
.Split('-')[0]
.Trim();
Ответ 4
В зависимости от того, насколько надежным/гибким вы хотите, чтобы ваша реализация была, это может быть немного сложнее. Здесь реализация, которую я использую:
public static class StringExtensions {
/// <summary>
/// takes a substring between two anchor strings (or the end of the string if that anchor is null)
/// </summary>
/// <param name="this">a string</param>
/// <param name="from">an optional string to search after</param>
/// <param name="until">an optional string to search before</param>
/// <param name="comparison">an optional comparison for the search</param>
/// <returns>a substring based on the search</returns>
public static string Substring(this string @this, string from = null, string until = null, StringComparison comparison = StringComparison.InvariantCulture)
{
var fromLength = (from ?? string.Empty).Length;
var startIndex = !string.IsNullOrEmpty(from)
? @this.IndexOf(from, comparison) + fromLength
: 0;
if (startIndex < fromLength) { throw new ArgumentException("from: Failed to find an instance of the first anchor"); }
var endIndex = !string.IsNullOrEmpty(until)
? @this.IndexOf(until, startIndex, comparison)
: @this.Length;
if (endIndex < 0) { throw new ArgumentException("until: Failed to find an instance of the last anchor"); }
var subString = @this.Substring(startIndex, endIndex - startIndex);
return subString;
}
}
// usage:
var between = "a - to keep x more stuff".Substring(from: "-", until: "x");
// returns " to keep "
Ответ 5
Вот как я могу это сделать
public string Between(string STR , string FirstString, string LastString)
{
string FinalString;
int Pos1 = STR.IndexOf(FirstString) + FirstString.Length;
int Pos2 = STR.IndexOf(LastString);
FinalString = STR.Substring(Pos1, Pos2 - Pos1);
return FinalString;
}
Ответ 6
Regex здесь переполняется.
Вы можете использовать string.Split
с перегрузкой, которая принимает string[]
для разделителей, но это также будет излишним.
Посмотрите Substring
и IndexOf
- первое, чтобы получить части строки, указанной и индекс, и длину, а второй - для поиска индексированных внутренних строк/символов.
Ответ 7
Я думаю, что это работает:
static void Main(string[] args)
{
String text = "One=1,Two=2,ThreeFour=34";
Console.WriteLine(betweenStrings(text, "One=", ",")); // 1
Console.WriteLine(betweenStrings(text, "Two=", ",")); // 2
Console.WriteLine(betweenStrings(text, "ThreeFour=", "")); // 34
Console.ReadKey();
}
public static String betweenStrings(String text, String start, String end)
{
int p1 = text.IndexOf(start) + start.Length;
int p2 = text.IndexOf(end, p1);
if (end == "") return (text.Substring(p1));
else return text.Substring(p1, p2 - p1);
}
Ответ 8
Рабочее решение LINQ:
string str = "super exemple of string key : text I want to keep - end of my string";
string res = new string(str.SkipWhile(c => c != ':')
.Skip(1)
.TakeWhile(c => c != '-')
.ToArray()).Trim();
Console.WriteLine(res); // text I want to keep
Ответ 9
string str="super exemple of string key : text I want to keep - end of my string";
int startIndex = str.IndexOf("key") + "key".Length;
int endIndex = str.IndexOf("-");
string newString = str.Substring(startIndex, endIndex - startIndex);
Ответ 10
или, с регулярным выражением.
using System.Text.RegularExpressions;
...
var value =
Regex.Match(
"super exemple of string key : text I want to keep - end of my string",
"key : (.*) - ")
.Groups[1].Value;
с примером .
Вы можете решить, может ли его перебор.
или
как проверенный метод расширения
using System.Text.RegularExpressions;
public class Test
{
public static void Main()
{
var value =
"super exemple of string key : text I want to keep - end of my string"
.Between(
"key : ",
" - ");
Console.WriteLine(value);
}
}
public static class Ext
{
static string Between(this string source, string left, string right)
{
return Regex.Match(
source,
string.Format("{0}(.*){1}", left, right))
.Groups[1].Value;
}
}
Ответ 11
Поскольку :
и -
уникальны, вы можете использовать:
string input;
string output;
input = "super example of string key : text I want to keep - end of my string";
output = input.Split(new char[] { ':', '-' })[1];
Ответ 12
var matches = Regex.Matches(input, @"(?<=key :)(.+?)(?=-)");
Это возвращает только значения (-ы) между "ключом" и следующим случаем "-"
Ответ 13
Я использовал фрагмент кода от Виджая Сингха Раны, который в основном выполняет эту работу. Но это вызывает проблемы, если firstString
уже содержит lastString
. Я хотел извлечь access_token из ответа JSON (не загружен анализатор JSON). Мой firstString
был \"access_token\": \"
, а мой lastString
был \"
. Я закончил с небольшой модификацией
string Between(string str, string firstString, string lastString)
{
int pos1 = str.IndexOf(firstString) + firstString.Length;
int pos2 = str.Substring(pos1).IndexOf(lastString);
return str.Substring(pos1, pos2);
}
Ответ 14
Вы можете использовать метод расширения ниже:
public static string GetStringBetween(this string token, string first, string second)
{
if (!token.Contains(first)) return "";
var afterFirst = token.Split(new[] { first }, StringSplitOptions.None)[1];
if (!afterFirst.Contains(second)) return "";
var result = afterFirst.Split(new[] { second }, StringSplitOptions.None)[0];
return result;
}
Использование:
var token = "super exemple of string key : text I want to keep - end of my string";
var keyValue = token.GetStringBetween("key : ", " - ");
Ответ 15
Если вы ищете 1-строчное решение, вот оно:
s.Substring(s.IndexOf("eT") + "eT".Length).Split("97".ToCharArray()).First()
Целое 1-строчное решение с System.Linq
:
using System;
using System.Linq;
class OneLiner
{
static void Main()
{
string s = "TextHereTisImortant973End"; //Between "eT" and "97"
Console.WriteLine(s.Substring(s.IndexOf("eT") + "eT".Length)
.Split("97".ToCharArray()).First());
}
}
Ответ 16
У вас уже есть хорошие ответы, и я понимаю, что код, который я предоставляю, далек от самого эффективного и чистого. Однако я подумал, что это может быть полезно для образовательных целей. Мы можем использовать готовые классы и библиотеки в течение всего дня. Но, не понимая внутренней работы, мы просто имитируем и повторяем и никогда не узнаем ничего. Этот код работает и является более простым или "девственным", чем некоторые другие:
char startDelimiter = ':';
char endDelimiter = '-';
Boolean collect = false;
string parsedString = "";
foreach (char c in originalString)
{
if (c == startDelimiter)
collect = true;
if (c == endDelimiter)
collect = false;
if (collect == true && c != startDelimiter)
parsedString += c;
}
В итоге вы получите нужную строку, назначенную переменной parsedString. Имейте в виду, что он также будет захватывать начальные и предыдущие пробелы. Помните, что строка - это просто массив символов, которые можно манипулировать, как и другие массивы с индексами и т.д.
Позаботьтесь.
Ответ 17
Как я всегда говорю, ничего невозможного:
string value = "super exemple of string key : text I want to keep - end of my string";
Regex regex = new Regex(@"(key \: (.*?) _ )");
Match match = regex.Match(value);
if (match.Success)
{
Messagebox.Show(match.Value);
}
Примечание, которое должно добавить ссылку System.Text.RegularExpressions
Надеюсь, что я помог.
Ответ 18
С помощью dotnetcore 3.0 вы можете
var s = "header-THE_TARGET_STRING.7z";
var from = s.IndexOf("-") + "-".Length;
var to = s.IndexOf(".7z");
var versionString = f[from..to]; // THE_TARGET_STRING