Extracto de expresiones regulares de la cadena xx: xx: formato xx

8

Soy muy nuevo en programación y tengo una pregunta, estoy tratando de usar el método Regex para extraer horas, minutos y segundos de una cadena y ponerlos en una matriz, pero hasta ahora puedo hacerlo con un solo número:

 int initialDay D = 0;
 string startDay = Console.ReadLine(); //input:  "It started 5 days ago"
 var resultString = Regex.Match(startDay, @"\d+").Value; 
 initialDay = Int32.Parse(resultString);   // initialDay here equals 5.

¿Cómo se las arregla para leer una cadena 06: 11: 33 y transformar estas horas, minutos y segundos en una serie de entradas? Entonces la matriz resultante sería así:

int[] array = new int[] {n1, n2, n3}; // the n1 would be 6, n2 would be 11 and n3 would be 33

¡Gracias por su tiempo por adelantado!

Igor Cherkasov
fuente

Respuestas:

10

Si la entrada está en este formato (dd: dd: dd), en realidad no necesita regex en esto. Puede usar el método String.Split (). Por ejemplo:

string test = "23:22:21";
string []res = test.Split(':');

La matriz res ahora contendrá "23", "22", "21" como sus elementos. Solo necesita convertirlos en int.

Glennmark
fuente
Gracias, esto es exactamente lo que necesitaba. Tal vez me estaba adelantando con Regex.
Igor Cherkasov
8

A menos que esté tratando de aprender expresiones regulares, no hay razón para que realice este análisis usted mismo.

Use el TimeSpan.Parse()método para esta tarea.

Tanveer Badar
fuente
4

Podría usar string.Split()para obtener una matriz de elementos separados por :. Luego puede recorrerlo, int.Parselos elementos y asignarlos a la matriz de enteros.

string[] buffer = startDay.Split(':');
int[] array = new int[buffer.Length];
for (int i = 0; i < buffer.Length; i++)
{
    array[i] = int.Parse(buffer[i]);
}

O puede usar Linq's Select()para hacer el análisis.

int[] array = startDay.Split(':').Select(e => int.Parse(e)).ToArray();
poco pegajoso
fuente
4

Usar Regex.Matches(string input, string pattern)así:

var results = Regex.Matches(startDay, @"\d+");
var array = (from Match match in results
             select Convert.ToInt32(match.Value))
            .ToArray();
NoGTNoHappy
fuente
4

Manera RegEx:

var pattern = @"(\d{1,2})\s?\:\s?(\d{1,2})\s?\:\s?(\d{1,2})";
var input = "06 : 11 : 33";
var arr = Regex.Matches(input, pattern)
    .Cast<Match>()
    .SelectMany(x => x.Groups.Cast<Group>()
    .Skip(1)
    .Select(y => int.Parse(y.Value)))
    .ToArray();

Console.WriteLine(string.Join("\n", arr));

La salida:

06
11
33

regex101

JQSOFT
fuente
3

Si tiene fecha como cadena simple, puede usar el método de división:

string dataString = "06 : 11 : 33";
string[] arrayStr = dataString.Split(':');

Entonces puedes hacer una lista int usando System.Linq:

List<int> intList = arrayStr.Select(p => Convert.ToInt32(p)).ToList();
ElConrado
fuente