Combinando uma seqüência tempo com uma expressão regular
Pergunta
Gostaria de coincidir com a hora (10.00) a partir de uma string com a data e hora ( "21.01.08 10,00"). Eu estou usando a seguinte expressão regular:
new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}\\b" "g");
Mas isso corresponde 21,01 a partir de 21.01.08 e 10.00.
Eu estou usando PCRE como meu mecanismo de expressão regualar.
Update:
Me desculpe, eu deveria ter mais sido mais claro. Os dados e tempo são parte de uma cadeia maior. Eu quero extrair o tempo de que string.
Por exemplo:
"Em 21.01.08, das 10h00 um partido terá lugar na biblioteca" "21.08.08 - Às 10:00 haverá uma festa" "Em 21.08.08 você está programado para um .... O ... terá início às 10.00"
Isso é possível?
Solução
Seu regex original não fez trabalho porque \b
(limite de palavra) corresponde ao "". em "21.01.08". Você precisa do código das fronteiras mais robusta:
(?:[^\d:.]|^)(\d\d?[.:]\d\d)(?![.:\d])
Isto captura o tempo, em qualquer uma das notações que você usou, enquanto excluindo datas. Note que ele não validar o tempo. Por exemplo, ela corresponderá a "88:99" Validando o tempo é possível, mas complica o padrão significativamente e é provável que seja um exagero para a maioria das situações.
Seria bom usar um olhar-behind em vez da não-captura não suporte de largura variável olhar-behind agrupamento mas PCRE fazer.
Outras dicas
^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$
deve fazer o truque com a parte da hora de ser colocado em um grupo de captura.
"nova RegExp" Eu não tenho certeza sobre (Java talvez?). Em Perl você poderia obter o valor como ...
if ("21.01.08 10.00" =~ m/^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$/g) {
$time_part = $1;
}
em .NET o seguinte deve funcionar ...
Regex r = new Regex(@"^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$");
string dateTimeString = "21.01.08 10.00";
if (r.IsMatch(dateTimeString)) {
string timePart = r.Match(dateTimeString).Groups[1].Value;
Console.Write(timePart);
}
Console.ReadKey();
Você também pode usar um Nomeado Captura se você quiser usar algo menos ambíguo então o índice para o grupo de captura.
tente usar
new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}$" "g");
$ indica o fim de corda