Регулярное выражение для соответствия различным моментам времени - PullRequest
0 голосов
/ 02 февраля 2020

При попытке сопоставить эти различные стили времени, например:

const str = `
  12) 9 p.m. A walk away

  06) Noon. Snack 

  4) 10:30 a.m. A stroll`;

Чтобы извлечь как:

["9 p.m.", "Noon", "10:30 a.m."]

Я использую это выражение регулярного выражения :

/([0-1]?[0-9]|2[0-3]:[0-5]?[0-9] p.m.|a.m.|Noon)/g

Но str.match() возвращается как:

["12", "9", "06", "Noon", "4", "10", "3", "0", "a.m."]

Есть ли проблема с группами захвата?

1 Ответ

3 голосов
/ 02 февраля 2020

Вы можете сопоставить часы и сделать часть минут необязательной, используя (?::[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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...