Obtener cadena entre dos cadenas en una cadena

Tengo una cadena como:

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

Solo quiero mantener la cadena que está entre "key : " y " - " . ¿Cómo puedo hacer eso? ¿Debo usar un Regex o puedo hacerlo de otra manera?

Tal vez, una buena forma es simplemente cortar una subcadena:

 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; 

o solo con operaciones de cadena

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

Puedes hacerlo sin expresiones regulares

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

Dependiendo de qué tan robusto / flexible quieras que sea tu implementación, esto puede ser un poco complicado. Aquí está la implementación que 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 es exagerado aquí.

Podría usar una string[] string.Split con la sobrecarga que toma una string[] para los delimitadores, pero eso también sería excesivo.

Mire Substring e IndexOf : el primero para obtener partes de una cadena dada e índice y una longitud, y el segundo para buscar cadenas internas / caracteres indexados.

Esta es la forma en que puedo hacer eso

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

Creo que esto 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); 

o, con una expresión regular.

 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; 

con un ejemplo corriendo

Usted puede decidir si es excesivo.

o

como un método de extensión no validado

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

Una solución LINQ que funciona:

 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 

Como el : y el - son únicos, puede 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]; 

Puede usar el siguiente método de extensión:

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

El uso es:

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

Ya tiene algunas buenas respuestas y me doy cuenta de que el código que proporciono está lejos de ser el más eficiente y limpio. Sin embargo, pensé que podría ser útil para fines educativos. Podemos usar clases y bibliotecas preconstruidas durante todo el día. Pero sin entender el funcionamiento interno, simplemente estamos imitando y repitiendo y nunca aprenderemos nada. Este código funciona y es más básico o “virgen” que algunos de los otros:

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

Terminas con la cadena deseada asignada a la variable de análisis sintáctico. Tenga en cuenta que también capturará el procedimiento y los espacios precedentes. Recuerde que una cadena es simplemente una matriz de caracteres que pueden manipularse como otras matrices con índices, etc.

Cuídate.

Como siempre digo que nada es imposible:

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

Recuerde que debe agregar referencia de System.Text.RegularExpressions

Espero que haya ayudado.

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

Esto devuelve solo el (los) valor (es) entre "clave" y la siguiente ocurrencia de "-"