Obter string entre duas strings em uma string

Eu tenho uma string como:

"super exemple of string key : text I want to keep - end of my string" 

Eu quero apenas manter a string que está entre "key : " e " - " . Como eu posso fazer isso? Devo usar um Regex ou posso fazê-lo de outra maneira?

Talvez, uma boa maneira seja apenas recortar uma substring:

 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); 
 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; 

ou apenas com operações de string

 var start = input.IndexOf("key : ") + 6; var match2 = input.Substring(start, input.IndexOf("-") - start); 

Você pode fazer isso sem regex

  input.Split(new string[] {"key :"},StringSplitOptions.None)[1] .Split('-')[0] .Trim(); 

Dependendo de quão robusto / flexível você quer que sua implementação seja, isso pode realmente ser um pouco complicado. Aqui está a implementação que eu uso:

 public static class StringExtensions { ///  /// takes a substring between two anchor strings (or the end of the string if that anchor is null) ///  /// a string /// an optional string to search after /// an optional string to search before /// an optional comparison for the search /// a substring based on the search 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 " 

Regex é um exagero aqui.

Você poderia usar string.Split com a sobrecarga que leva uma string[] para os delimitadores, mas que também seria um exagero.

Olhe para Substring e IndexOf – o primeiro para obter partes de uma string dada e um índice e um comprimento e o segundo para encontrar indexados de strings / caracteres internos.

Aqui está a maneira como eu posso fazer isso

  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; } 

Eu acho que isso funciona:

  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); } 
  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); 

ou, com um regex.

 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; 

com um exemplo em execução .

Você pode decidir se é um exagero.

ou

como um método de extensão sob validação

 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; } } 

Uma solução LINQ funcional:

 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 

Já que o : e o - são únicos, você poderia usar:

 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]; 

Você pode usar o método de extensão abaixo:

 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; } 

O uso é:

 var token = "super exemple of string key : text I want to keep - end of my string"; var keyValue = token.GetStringBetween("key : ", " - "); 

Você já tem algumas boas respostas e percebo que o código que estou fornecendo está longe de ser o mais eficiente e limpo. No entanto, achei que poderia ser útil para fins educacionais. Podemos usar classs e bibliotecas pré-construídas durante todo o dia. Mas sem entender o funcionamento interno, estamos simplesmente imitando e repetindo e nunca aprenderemos nada. Este código funciona e é mais básico ou “virgem” do que alguns dos outros:

 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; } 

Você termina com a string desejada atribuída à variável parsedString. Tenha em mente que ele também irá capturar os espaços precedentes e anteriores. Lembre-se que uma string é simplesmente uma matriz de caracteres que podem ser manipulados como outros arrays com índices etc.

Cuidar.

Como eu sempre digo que nada é impossível:

 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); } 

Lembre-se que deve adicionar referência de System.Text.RegularExpressions

Espero que tenha ajudado.

 var matches = Regex.Matches(input, @"(?< =key :)(.+?)(?=-)"); 

Isso retorna apenas o (s) valor (es) entre "chave:" e a seguinte ocorrência de "-"