Tengo problemas para dividir el texto a continuación. ¿Hay alguna forma más fácil de dividir esto?

La entrada será como

"1[,]Group A[,]2[,]Group B[,]3[,]Group C[,]4[,]Group D"

O

"a[,]Group A[,]b[,]Group B[,]c[,]Group C[,]d[,]Group D"

O

"a)[,]Group A[,]b)[,]Group B[,]c)[,]Group C[,]d)[,]Group D"

O a veces será como el texto siguiente. ¿Cómo identifico también la ausencia del patrón anterior?

"1 Group A[,]2 Group B[,]3 Group C[,]4 Group D"

Producción esperada

Grupo A
Grupo B
Grupo C
Grupo D

c#
0
sd0505 7 may. 2021 a las 21:18

3 respuestas

La mejor respuesta

Cociné este método muy rápido con una verificación de pseudopatrón:

static void pattern(string input)
{
    string[] splits = input.Split(new[] { "[,]" }, StringSplitOptions.None);
    if (splits.Length < 2)
        return;

    //pseudo pattern check
    char[] patternStart = splits[0].ToCharArray();
    for(int i = 2; i < splits.Length; i+=2)
    {
        patternStart[0]++;
        if (!patternStart.SequenceEqual(splits[i]))
        {
            Console.WriteLine("pattern fail");
            return;
        }
    }

    foreach (string entry in splits.Where((s, i) => i % 2 == 1))
        Console.WriteLine(entry);
}

La verificación del patrón se basa en la idea de que siempre es el primer carácter del patrón el que aumenta y siempre será algo que progresa en 1 en la tabla ASCII (por ejemplo, a, b, c o A, B, C o 1, 2,3)

Ejecutando esto con los patrones proporcionados:

pattern("1[,]Group A[,]2[,]Group B[,]3[,]Group C[,]4[,]Group D");
Console.WriteLine();
pattern("a[,]Group A[,]b[,]Group B[,]c[,]Group C[,]d[,]Group D");
Console.WriteLine();
pattern("a)[,]Group A[,]b)[,]Group B[,]c)[,]Group C[,]d)[,]Group D");
Console.WriteLine();
pattern("1 Group A[,]2 Group B[,]3 Group C[,]4 Group D");
Console.WriteLine();

Rendimientos

Group A
Group B
Group C
Group D

Group A
Group B
Group C
Group D

Group A
Group B
Group C
Group D

pattern fail
0
Jack T. Spades 7 may. 2021 a las 18:39

En lugar de dividir su cuerda, puede intentar simplemente elegir las partes que desee de la cuerda:

var r = new Regex("Group [A-Z]");
var m = r.Matches(inputstring);
var result = m.Select(t => t.Value).ToList();

Eso coincidirá con cualquier "Grupo" seguido de una sola letra mayúscula.

2
Juri Robl 7 may. 2021 a las 19:13

Suponiendo que los nombres de su grupo deben tener más de dos caracteres, simplemente puede usar:

var groups = input.Replace("[,]","\0").Split( '\0' ).Where( x => x.Length > 2 );
var output = string.Join( " ", groups );

O

var groups = input.Split( "[,]" ).Where( x => x.Length > 2 );
var output = string.Join( " ", groups );

Si los nombres de su grupo pueden tener 2 o menos caracteres, sus requisitos no están completos, ya que existe ambigüedad. Por ejemplo, con esta entrada:

a)[,]a)[,]b)[,]b)

La salida puede ser

a) b)

O

a) a) b) b)

... por lo que deberá crear una regla para distinguir el texto que desea conservar del texto que desea descartar.

0
John Wu 7 may. 2021 a las 21:12