Aquí está mi código para encontrar una cadena entre {} :

var text = "Hello this is a {Testvar}...";
int tagFrom = text.IndexOf("{") + "{".Length;
int tagTo = text.LastIndexOf("}");
String tagResult = text.Substring(tagFrom, tagTo - tagFrom);

Salida de tagResult: Testvar

Esto solo funciona para un solo uso. ¿Cómo puedo aplicar esto para varias etiquetas? (por ejemplo, en un bucle While)

Por ejemplo:

var text = "Hello this is a {Testvar}... and we have more {Tagvar} in this string {Endvar}.";

tagResult[] Salida (por ejemplo, matriz): Testvar , Tagvar , Endvar

-2
Seimann 15 sep. 2018 a las 01:55

5 respuestas

La mejor respuesta

Recomiendo usar expresiones regulares para la tarea.

using System;
using System.Text.RegularExpressions;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            var regex = new Regex(@"(\{(?<var>\w*)\})+", RegexOptions.IgnoreCase);
            var text = "Hello this is a {Testvar}... and we have more {Tagvar} in this string {Endvar}.";
            var matches = regex.Matches(text);

            foreach (Match match in matches)
            {
                var variable = match.Groups["var"];
                Console.WriteLine($"Found {variable.Value} from position {variable.Index} to {variable.Index + variable.Length}");
            }
        }        
    }
}

Salida:

Encontrado Testvar de la posición 17 a la 24

Encontrado Tagvar de la posición 47 a la 53

Encontrado Endvar de la posición 71 a la 77

Para obtener más información sobre la expresión regular, visite la página de referencia de MSDN:

https://docs.microsoft.com/en-us/dotnet/standard/base-types/regular-expression-language-quick-reference

Y esta herramienta puede ser excelente para comenzar a probar sus propias expresiones:

http://regexstorm.net/tester

¡Espero que esto ayude!

1
Miguel 14 sep. 2018 a las 23:24

Muchas formas de desollar a este gato, aquí hay algunas:

  • Dividirlo en {luego recorrer, dividir cada resultado en} y tomar el elemento 0 cada vez

  • Dividir en {o} y luego recorrer solo tomando elementos impares

  • Ajuste su lógica existente para que use IndexOf dos veces (en lugar de lastindexof). Cuando busque un} pase el índice de {como el índice de inicio de la búsqueda

0
Caius Jard 14 sep. 2018 a las 23:09

Usaría el patrón Regex {(\\w+)} para obtener el valor.

Regex reg = new Regex("{(\\w+)}");     
var text = "Hello this is a {Testvar}... and we have more {Tagvar} in this string {Endvar}.";
string[] tagResult = reg.Matches(text)
    .Cast<Match>()
    .Select(match => match.Groups[1].Value).ToArray();
foreach (var item in tagResult)
{
    Console.WriteLine(item);
}

c # en línea

Resultado

Testvar
Tagvar
Endvar
1
D-Shih 14 sep. 2018 a las 23:15

Esto es tan fácil usando Expresiones regulares solo usando un patrón simple como {([\d\w]+)}. Vea el siguiente ejemplo: -

using System.Text.RegularExpressions;
...
MatchCollection matches = Regex.Matches("Hello this is a {Testvar}... and we have more {Tagvar} in this string {Endvar}.", @"{([\d\w]+)}");
foreach(Match match in matches){
    Console.WriteLine("match : {0}, index : {1}", match.Groups[1], match.index);
}

Puede encontrar cualquier serie de letras o números en estos corchetes uno por uno.

0
Azhy 14 sep. 2018 a las 23:15

IndexOf() tiene otra sobrecarga que toma el índice de inicio del cual comienza a buscar la cadena dada. si lo omite, siempre se verá desde el principio y siempre encontrará el primero.

 var text = "Hello this is a {Testvar}...";
    int start = 0, end = -1;
    List<string> results = new List<string>();
    while(true)
    {
        start = text.IndexOf("{", start) + 1;
        if(start != 0)
           end = text.IndexOf("}", start);
        else
           break;
        if(end==-1) break;
        results.Add(text.Substring(start, end - start));
        start = end + 1;  
    }
4
Ashkan Mobayen Khiabani 14 sep. 2018 a las 23:11