Pergunta

Eu gostaria de validar e extrair a horas e minutos de uma corda usando regex em .net. Apenas para recuperar os dois números, separados (ou não) por :. Formato aceitoh:m ou m. Inaceitado :m, h:.

EDITAR:Isso é para observar que o número de horas poderia transbordar os 23 até ... 32.

O transbordamento por horas (mais de 32) e minutos (mais de 59) farei após a recuperação dos valores (int.Parse)


* apenas por diversão Talvez haja um regex relativamente simples que possa filtrar também o> 32 por hora e> 59 por minuto (para minutos Poderia ser [0-5]*[0-9], por horas eu não sei)?

Foi útil?

Solução 4

Finalmente, o código para validar (até 32) e também a obtenção de valores é (versão vb.net):

Dim regexHour As New Regex( _ 
   "((?<hours>([012]?\d)|(3[01]))\:)?(?<minutes>[0-5]?\d)", _
    RegexOptions.ExplicitCapture)
Dim matches As MatchCollection = regexHour.Matches(value)

If matches.Count = 1 Then
  With matches(0)
    ' (!) The first group is always the expression itself. '
    If .Groups.Count = 3 Then ' hours : minutes '
      strHours = .Groups("hours").Value
      If String.IsNullOrEmpty(strHours) Then strHours = "0"
      strMinutes = .Groups("minutes").Value
    Else ' there are 1, 3 or > 3 groups '
      success = False
    End If
  End With
Else
  success = False
End If

Obrigado a todos que contribuem para esta resposta!

Outras dicas

Você está morto em um regex? Porque DateTime.Parse Seria muito mais simples e mais poderoso aqui.

 DateTime dt = DateTime.Parse("12:30 AM");

Então o DT oferece tudo o que você precisa saber sobre o tempo. DateTime.TryParse() Pode ser melhor, caso você esteja menos certo de que é uma string de tempo.

(?:(\d\d?):)?([0-5][0-9])

Se você deseja validar horas:

(?:([01]?[0-9]|2[0-3]):)?([0-5][0-9])

EDITAR: Testado e corrigido.


No entanto, a melhor maneira de fazer isso é com DateTime.ParseExact, assim: (testado)

TimeSpan time = DateTime.ParseExact(
    input, 
    new string[] { "HH:mm", "H:mm", "mm", "%m" }, //The % is necessary to prevent it from being interpreted as a single-character standard format.
    CultureInfo.InvariantCulture, DateTimeStyles.None
).TimeOfDay;

Para validação, você pode usar TryParseExact.

Aqui está a string regex. Você pode acessar os grupos de captura nomeados "horas" e "minutos". Use sinalizadores "explicitcapture" e "singleline".

@"^((?u003Chours> [0-9] {1,2}) :)? (?u003Cminutes> [0-9] {1,2}) $ "

Você pode testar as regexes aqui: http://derekslager.com/blog/postss/2007/09/a-better-dotnet-regular-expression-tester.ashx

Como mencionado, uma chamada de análise DateTime pode ser melhor, a menos que você precise validar que somente esse formulário é permitido.

Além disso, os valores negativos não são permitidos, nem decimais. (Mas, o regex pode ser alterado para incluí -los, se necessário).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top