Obter todas as strings entre dois caracteres em uma string

Eu tenho uma string como esta:

{abc} @ {defgh} mner {123}

Como posso obter todas as strings entre { e } como uma matriz ou lista?

Como isso:

{{abc}, {defgh}, {123}}

1
Usando expressões regulares com grupos de captura
adicionado o autor Caius Jard, fonte
@radin como você sabe loop não é o melhor caminho? Poste seu código para que possamos lhe dizer. Diga-nos também o que é "melhor" para você
adicionado o autor Caius Jard, fonte
Sim, acho que a edição que você fez invalidará muitas respostas aqui. Também não podemos postar mais respostas porque esta questão é encerrada como duplicada. Faça uma nova pergunta e coloque a versão editada; {a {b} c} d {e} é um requisito muito diferente de {a} b {c} d {e} e provavelmente requer um loop que conte as chaves e só emite um texto quando a contagem se torna 0
adicionado o autor Caius Jard, fonte
Você já tentou alguma coisa? Há algumas maneiras de fazer isso
adicionado o autor shree.pat18, fonte
Duplicação possível de Obter valores entre chaves C# e muitos outros .
adicionado o autor BACON, fonte
@radin esta pergunta foi fechada como uma duplicata, que era a sua pergunta original. A nova adição altera o escopo da questão e, como tal, é melhor se você simplesmente abrir uma nova (em geral). Nesse caso específico, essa pergunta responde à sua necessidade exata: stackoverflow.com/questions/2778532/…
adicionado o autor Sascha Wolf, fonte
Isso é possível {abc}}} @ {defgh} mner {123} ? Ou este asd {asd ?
adicionado o autor FCin, fonte
sim, eu escrevo um loop para obter strings entre {e}, mas não é o melhor caminho. @ shree.pat18
adicionado o autor radin, fonte
@FCin Sim, é possível.
adicionado o autor radin, fonte
@CaiusJard eu fiz este link . mas minha string é diferente. {asd {asd} dd} 34 {wqw}
adicionado o autor radin, fonte
@CaiusJard Ok, obrigado.
adicionado o autor radin, fonte
@BACON Eu edito esta pergunta, por favor, verifique.
adicionado o autor radin, fonte

7 Respostas

usando Regex é uma boa escolha

    string str = "{abc}@{defgh}mner{123}";
    foreach (Match match in Regex.Matches(str,"{[^}]+}"))
    {
        Console.WriteLine(match.Value);
    }
2
adicionado

Usando sites como o RegExr, você pode facilmente testar seu regex antes de usá-lo no código:

string str = "{abc}@{defgh}mner{123}";
foreach (Match match in Regex.Matches(str,"(\{.+?\})"))
{
    Console.WriteLine(match.Value);
}

https://regexr.com/460a3

1
adicionado

Você pode usar o Regex

var str = "{abc}@{defgh}mner{123}";
var regex = new Regex(@"({\w+})",RegexOptions.Compiled);
var result = regex.Matches(str).Cast().Select(x=>x.Value);

result is IEnumerable as required in OP

Saída (valor do resultado)

{abc} 
{defgh} 
{123} 
0
adicionado

Usando o Regex e transformando-os em uma lista usando o LINQ

var l = new Regex(@"\{(\w+)\}")
        .Matches("{abc}@{defgh}mner{123}l")
        .Cast()
        .Select(m => m.Groups[0].Value)
        .ToList();

Como funciona:

O regex {(\ w +)} significa:

  • {: encontre um {
  • (: começa a capturar o grupo de dados
  • \ w +: corresponde a um ou mais caracteres de palavra (de a a z, de 0 a 9)
  • ): fim da captura
  • ): encontre um}

Isso vai encontrar todo o texto entre as chaves

O regex dará uma MatchCollection

Nós temos que usar o Cast para transformá-lo em algo que o linq possa consultar

Nós. Selecionamos itens da coleção, m é um item individual, m.Groups [0] .Value é o texto capturado pelo grupo, entre as chaves

.ToList retorna todos os textos em uma lista

0
adicionado

Você pode tentar seguir o código, ele não usa expressões regulares, então você não precisa saber disso!

static void Main(string[] args)
{
  string s = "{abc}@{defgh}mner{123}";
  int i1, i2 = 0;
  while ((i1 = s.IndexOf('{', i2)) >= 0)
  {
    i2 = s.IndexOf('}', i1);
   //Here you can add Substring result to some list or assign it to a variable...
    Console.WriteLine(s.Substring(i1 + 1, i2 - i1 - 1));
  }
}
0
adicionado
var input = "{abc}@{defgh}mner{123}";
var pattern = @"\{(.+?)\}";

var matches = Regex.Matches(input, pattern);
IList output = new List();
foreach (Match match in matches)
    output.Add(match.Groups[0].Value);

Resultado do violino


Versão simples

var input = "{abc}@{defgh}mner{123}";
var pattern = @"\{(.+?)\}";

var matches = Regex.Matches(input, pattern);
IList output = matches.Cast().Select(x => x.Groups[0].Value).ToList();           
output.Dump();  

Resultado do violino

0
adicionado
using System;
using System.Text.RegularExpressions;

public class Example
{
  public static void Main()
  {
   string pattern = @"{([A-Za-z0-9\-]+)}" ; 
   string input = "{abc}@{defgh}mner{123}";
   MatchCollection matches = Regex.Matches(input, pattern);

   foreach (Match match in matches)
   {
     Console.WriteLine(match.Groups[1].Value);
   }
   Console.WriteLine();
  }
}

Saída:

     

abc

     

defgh

     

123

You can check the Online Execution of the code : http://tpcg.io/uuIxo1

0
adicionado