Проверьте наличие необязательного набора символов с помощью регулярных выражений - PullRequest
0 голосов
/ 04 октября 2018

У меня есть дата в следующем формате:

4 октября 2019 г. 10:30

Эта дата должна быть разбита на месяц, день, год и время.Где время не является обязательным.Другими словами, это также должно быть действительным:

4 октября 2019

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

const match = /(\w+)( [^.]+)?, ([0-9]{4}) ((?:0[1-9]|1[0-2]):[0-9]{2} (?:am|pm))?/.exec(dt);

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

Так что в этом случае, что я делаю не так?

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

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

(\w+) ([^,]+)?, ([0-9]{4})\s?([01]\d:\d\d+ am|pm)?
0 голосов
/ 04 октября 2018

Пробел перед необязательной группой по-прежнему обязателен, поэтому у вас нет совпадения со второй строкой.

Поместите пробел в группу:

/(\w+)( [^,]+)?, ([0-9]{4})( (?:0[1-9]|1[0-2]):[0-9]{2} (?:am|pm))?/ 
                            ^

См. regex demo .

Примечание. Я также считаю, что [^.]+ должно быть [^,]+, любые 1 или более символов, кроме запятой .

Вы можете дополнительно сократить шаблон до

/(\w+)( [^,]+)?, (\d{4})( (?:0[1-9]|1[0-2]):\d{2} [ap]m)?/

Обратите внимание, что было бы неплохо заменить буквенные пробелы на \s+ для соответствия любому пробелу 1+ и не беспокоиться о наличии жестких или обычных пробелов во входных данных:

/(\w+)(\s+[^,]+)?,\s+(\d{4})(\s+(?:0[1-9]|1[0-2]):\d{2}\s+[ap]m)?/
...