сопоставить два шаблона, сменяющих друг друга - PullRequest
0 голосов
/ 23 февраля 2010

Я создаю календарь, в котором пользователи могут устанавливать события и время в одной строке, например:

«Ужин в 6 вечера» - событие только со времени старта

«8:00 - 16:00 работа» - событие с периодом времени

Регулярное выражение, которое я сейчас использую, чтобы получить время:

[\d]{1,2}[.|:]?[\d]{0,2}[\s]?[am|pm|AM|PM]{0,2}

Работает нормально, но я не могу понять, как отфильтровать нежелательные события времени, если они происходят, например:

«Ужин в 18:00 в ресторане« 8 вечера ». В этом примере« 8 вечера »- это название ресторана, но оно будет интерпретировано как событие с периодом времени, а это не так. Я полагаю, что мне нужно написать регулярное выражение, которое будет соответствовать только шаблону времени в начале строки и следующему шаблону, который следует после него, без каких-либо слов между ними, но у меня пока нет успеха в создании такого регулярного выражения.

Есть предложения?

Ответы [ 3 ]

1 голос
/ 23 февраля 2010

Что, если вы используете следующее регулярное выражение

([\d]{1,2}[.|:]?[\d]{0,2}[\s]?[apm|APM]{0,2})( - )?([\d]{1,2}[.|:]?[\d]{0,2}[\s]?[apm|APM]{0,2})?(.*)

Это позволит вам получить доступ к различным разделам, например, ужин в 18:00 в ресторане '8 вечера' будет:

0 голосов
/ 23 февраля 2010

Вы можете попробовать использовать конструкцию lookbehind, чтобы выбрать только даты, которым не предшествуют буквы, отличные от «a», «p» и «m». Что-то в линии

(?<![letters other than apm].*)

Согласно http://www.regular -expressions.info / lookaround.html , не все реализации Regex поддерживают это в необходимой степени. Большинство из них, похоже, не позволяют. * Взгляд назад.

0 голосов
/ 23 февраля 2010

Исправит ли ^[\d]{1,2}[.|:]?[\d]{0,2}[\s]?[am|pm|AM|PM]{0,2} проблему соответствия '8pm' в вашем примере?

^ используется, чтобы соответствовать началу строки. $ можно использовать для сопоставления конца строки (на случай, если вам понадобится позже;)).

UPDATE:

Это немного некрасиво, но, похоже, работает:

[^'"][\d]{1,2}[.|:]?[\d]{0,2}[\s]?[am|pm|AM|PM]{0,2}[^'"]|^[\d]{1,2}[.|:]?[\d]{0,2}[\s]?[am|pm|AM|PM]{0,2}

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

UPDATE:

Я думаю, что эту версию немного легче читать:

([^'"]|^)[\d]{1,2}[.|:]?[\d]{0,2}[\s]?[am|pm|AM|PM]{0,2}[^'"]

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