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!

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.


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.


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();

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();


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


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();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.