2008-10-16 7 views
4

Я хотел бы совместить время (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 в качестве моего выражения выражения выражения.

Update:

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

Например:

«На 21.01.08 с 10.00 вечеринка будет проходить в библиотеке» «21.08.08 - В 10:00 будет вечеринка» «На 21.08.08 вы запланированы на .... ... начнутся в 10.00 «

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

ответ

4

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

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

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

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

0

попробовать с помощью

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

$ указывает на конец строки

1
^\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

Я не могу не думать, что `\ d \ d` так же легко читать, как` \ d {2} `; это еще более экономично при наборе текста. Если он превышает 3 (может быть, выше 2), или вам нужен диапазон {3,7}, то повторы великолепны. – 2008-10-16 16:24:26

 Смежные вопросы

  • Нет связанных вопросов^_^