Разбор строки времени с использованием регулярных выражений и преобразование в целое число - PullRequest
1 голос
/ 18 мая 2019

Я хочу разрешить пользователям вводить время в текстовом поле с маской, а затем проверять это время и преобразовывать его при необходимости для последующего сохранения.

Я попробовал метод проверки времени с использованием только регулярных выражений, но, честно говоря, не смог найти очень подробных ответов. Я решил просто разделить строку, введенную пользователем, на ее базовые компоненты, а затем преобразовать куски времени в целые числа для удобства сравнения.

'' '

Public Function CreateTimeString(TheTime As String, TheSuffix As String) As String 'wip
    Dim Hour As String = "00"
    Dim Minute As String = "00"
    Dim inthour As Integer
    Dim intminute As Integer
    Dim pattern As String = "(?<hour>\d*?):(?<minute>\d*?)"
    For Each m As Match In Regex.Matches(TheTime, pattern)
        Hour = m.Groups("hour").Value
        Minute = m.Groups("minute").Value
    Next

    inthour = Convert.ToInt32(Hour)
    intminute = Convert.ToInt32(Minute)

    TxtMeals.Text = Hour & ":" & Minute
End Function

'' '

Ошибка при попытке конвертировать Минутную строку в целое число. Комментируя это и тестирование показывает, что Час был успешно преобразован. Похоже, что минута не может быть найдена. Пример строки: 12:12 1:23 4:55 10:45 Кроме того, если я изменю шаблон, добавив пробел непосредственно перед последней кавычкой, ни то, ни другое не будет найдено, и я хотел бы знать, почему.

1 Ответ

1 голос
/ 18 мая 2019

m.Groups("minute").Value не будет найдено, потому что вы используете не жадное совпадение для \d*? для минутной части, для которой не задана конечная граница, как, например, $, поэтому она будет соответствовать по крайней мере, насколько это возможно, что будет0 раз.

Вы можете использовать:

(?<hour>\d+):(?<minute>\d+)

Вы можете использовать более точное совпадение, например, для 12-часового времени:

(?<hour>1[0-2]|0?[1-9]):(?<minute>[0-5][0-9])

или 24-часовое время:

(?<hour>[01]?[0-9]|2[0-3]):(?<minute>[0-5][0-9])

Вы можете использовать якоря ^ и $ для подтверждения начала и конца строки.

Regex demo | vb.net demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...