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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top