Сопоставление временной строки с регулярным выражением - PullRequest
4 голосов
/ 16 октября 2008

Я бы хотел сопоставить время (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»

Возможно ли это?

Ответы [ 3 ]

4 голосов
/ 16 октября 2008

Ваше оригинальное регулярное выражение не работало, потому что \b (граница слова) соответствует значению "." в "21.01.08." Вы должны кодировать границы более надежно:

(?:[^\d:.]|^)(\d\d?[.:]\d\d)(?![.:\d])

Это фиксирует время в любой из использованных вами систем обозначений, исключая даты. Обратите внимание, что это не проверяет время. Например, он будет соответствовать «88:99». Проверка времени возможна, но значительно усложняет схему и, вероятно, будет избыточной для большинства ситуаций.

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

1 голос
/ 16 октября 2008
^\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();

Вы также можете использовать Named Capture , если хотите использовать что-то менее двусмысленное, чем индекс в группе захвата.

0 голосов
/ 16 октября 2008

попробуйте использовать

new RegExp("\\b[0-9]{1,2}\\.[0-9]{1,2}$" "g");

$ обозначает конец строки

...