Corrispondenza di una stringa temporale con un'espressione regolare
Domanda
Vorrei abbinare l'ora (10.00) di una stringa con la data e l'ora ("21.01.08 10.00"). Sto usando la seguente espressione regolare:
new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}\\b" "g");
Ma questo corrisponde a 21.01 dal 21.01.08 e alle 10.00.
Sto usando PCRE come mio motore di espressione regualar.
Aggiornamento:
Mi dispiace, avrei dovuto essere più chiaro. I dati e il tempo fanno parte di una stringa più grande. Voglio estrarre il tempo da quella stringa.
Ad esempio:
" Il 21.01.08 dalle 10.00 una festa avrà luogo nella biblioteca " " 21.08.08 - Alle 10:00 ci sarà una festa " " Il 21.08.08 hai in programma un .... Il ... inizierà alle 10.00 "
È possibile?
Soluzione
Il tuo regex originale non ha funzionato perché \ b
(limite di parole) corrisponde a ". " in "21.01.08." Devi codificare i confini in modo più efficace:
(?:[^\d:.]|^)(\d\d?[.:]\d\d)(?![.:\d])
Questo cattura l'ora, in una delle notazioni che hai usato, escludendo le date. Si noti che non convalida l'ora. Ad esempio, corrisponderebbe a "88: 99" La convalida del tempo è possibile ma complica notevolmente il modello ed è probabile che sia eccessivo per la maggior parte delle situazioni.
Sarebbe bello usare un look-behind al posto del raggruppamento non-cattura, ma PCRE non supporta look-behind a larghezza variabile.
Altri suggerimenti
^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$
dovrebbe fare il trucco con la parte temporale messa in un gruppo di acquisizione.
il " nuovo RegExp " Non ne sono sicuro (forse Java?). In Perl potresti ottenere il valore come ...
if ("21.01.08 10.00" =~ m/^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$/g) {
$time_part = $1;
}
in .NET dovrebbe funzionare quanto segue ...
Regex r = new Regex(@"^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})<*>quot;);
string dateTimeString = "21.01.08 10.00";
if (r.IsMatch(dateTimeString)) {
string timePart = r.Match(dateTimeString).Groups[1].Value;
Console.Write(timePart);
}
Console.ReadKey();
Puoi anche utilizzare un Named Capture se vuoi usare qualcosa di meno ambiguo quindi l'indice nel gruppo di acquisizione.
prova a usare
new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}<*>quot; "g");
$ indica la fine della stringa