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.