Исправит ли ^[\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}[^'"]