Pergunta

Esta é supostamente uma pergunta muito fácil, mas eu simplesmente não consigo encontrar a solução certa. Há uma cadeia de caracteres no formato:

A:B=C;D:E=F;G:E=H;...

ao passo que A, B e C são alfanumérico (e pode ser mais baixa, bem como letras maiúsculas). A e B são de comprimento 1+, C pode estar vazio.

eu percebi que eu teria que usar algo ao longo das linhas de

((?<A>.+):(?<B>.+)=(?<C>.*);)*

mas eu não vejo como fazê-lo corresponder de uma forma preguiçosa. Eu também não estou certo de como obter os resultados das respectivas partidas para que eu apreciaria um exemplo de código pouco.

Eu ficaria feliz se você poderia me dar uma dica.

Foi útil?

Solução

Você pode usar \w para combinar caracteres alfanuméricos em vez de ., que combina com tudo. Em seguida, você pode tentar capturar um jogo de cada vez:

(?<A>\w+):(?<B>\w+)=(?<C>\w*);

Aqui está um pequeno exemplo:

Regex regex = new Regex("(?<A>\\w+):(?<B>\\w+)=(?<C>\\w*);");
string test = "A:B=C;D:E=F;G:E=H";

// get all matches
MatchCollection mc = regex.Matches(test);

foreach (Match m in mc) { 
    Console.WriteLine("A = {0}", m.Groups["A"].Value);
    Console.WriteLine("B = {0}", m.Groups["B"].Value);
    Console.WriteLine("C = {0}", m.Groups["C"].Value);
}

Nota : existem várias ferramentas que permitem que você experimente com expressões regulares e também fornecer algum tipo de ajuda; Eu pessoalmente gosto Expresso -. Experimentá-lo, ele vai ser muito útil para aprender

Outras dicas

é regex um requisito? Desde a corda tem uma muito bem estruturada, bem, estrutura, é fácil analisá-lo sem regex:

string input = "A:B=C;D:EF=G;E:H=;I:JK=L";
string[] elements = input.Split(new[] { ';' });
List<string[]> parts = new List<string[]>();
foreach (string element in elements)
{
    parts.Add(element.Split(new[] { ':', '=' }));
}
// result output
foreach (string[] list in parts)
{
    Console.WriteLine("{0}:{1}={2}", list[0], list[1], list[2]);
}

A saída será:

A:B=C
D:EF=G
E:H=
I:JK=L
Regex r = new Regex("(?<A>\\w)+:(?<B>\\w)+=(?<C>\\w)*;");

O \ w irá corresponder alfanuméricos e sublinhado, o equivalente a [a-zA-Z0-9 _].

A barra invertida é escapado na cadeia, por isso torna-se \ \ w.

Os grupos capta regex A, B, e C, e vai corresponder a 0 ou mais elementos de C ou grupos inteiros delimitados por um ponto e vírgula.

Você terá múltiplos Jogo objetos:

MatchCollection m = r.Matches(sampleInput);
// m[0] will contain A:B=C;
// m[1] will contain D:E=F;
// m[2] will contain G:E=H;
// ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top