Вы можете сопоставить часы и сделать часть минут необязательной, используя (?::[0-5][0-9])?
В вашем шаблоне вы используете одну группу для всех альтернатив, где вы хотите, чтобы группа сама по себе группировала набор альтернатив .
Часть am и pm может быть записана как [ap]\.m
(обратите внимание, что точка должна экранироваться, чтобы буквально соответствовать ей)
Вся внешняя группа может быть не захватывающей группой (?:
из которого вы можете взять совпадение
Чтобы предотвратить частичное совпадение, вы можете начать шаблон с границы слова \b
Шаблон можно записать как:
\b(?:(?:[01]?[0-9]|2[0-3])(?::[0-5][0-9])? [ap]\.m\.|Noon)
Regex demo
Если вы хотите соответствовать 12-часовому времени:
\b(?:(?:1[0-2]|0?[1-9])(?::[0-5][0-9])? [ap]\.m\.|Noon)
Regex demo
const pattern = /\b(?:(?:[01]?[0-9]|2[0-3])(?::[0-5][0-9])? [ap]\.m\.|Noon)/g;
const str = `
12) 9 p.m. A walk away
06) Noon. Snack
4) 10:30 a.m. A stroll`;
console.log(str.match(pattern));