Сопоставление строки времени с регулярным выражением
Вопрос
Я хотел бы сопоставить время (10.00) из строки с датой и временем («21.01.08 10.00»).Я использую следующее регулярное выражение:
new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}\\b" "g");
Но это соответствует 21.01 с 21.01.08 и 10.00.
Я использую PCRE в качестве механизма регулярных выражений.
Обновлять:
Извините, мне следовало бы быть более ясным.Данные и время являются частью более крупной строки.Я хочу извлечь время из этой строки.
Например:
«21.01.08 с 10.00 в библиотеке будет проходить вечеринка» «21.08.08 - в 10:00 будет вечеринка» 21.08.08, вы запланированы на .......начнется в 10.00"
Это возможно?
Решение
Ваше исходное регулярное выражение не сработало, потому что \b
(Граница слова) соответствует «». в «21.01.08». Вам нужно более надежно кодировать границы:
(?:[^\d:.]|^)(\d\d?[.:]\d\d)(?![.:\d])
Это фиксирует время в любой из использованных вами обозначений, исключая даты.Обратите внимание, что он не проверяет время.Например, это будет соответствовать «88:99». Проверка времени возможна, но значительно усложняет шаблон и, вероятно, в большинстве ситуаций будет излишней.
Было бы неплохо использовать просмотр назад вместо группировки без захвата, но PCRE не поддерживает просмотр назад переменной ширины.
Другие советы
^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$
должно помочь с помещением временной части в группу захвата.
«новый RegExp», насчет которого я не уверен (возможно, Java?).В Perl вы можете получить значение вроде...
if ("21.01.08 10.00" =~ m/^\d{2}\.\d{2}\.\d{2}\s(\d{2}\.\d{2})$/g) {
$time_part = $1;
}
в .NET должно работать следующее...
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();
Вы также можете использовать Именованный захват если вы хотите использовать что-то менее двусмысленное, тогда индексируйте группу захвата.
попробуйте использовать
new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}$" "g");
$ указывает конец строки