У меня проблемы с настройкой регулярного выражения для соответствия определенному формату. Вот желаемый формат:
Понедельник (любой день недели) 1-7 (месяц - день) 1:00 (время (12-часовой формат)) (допускается несколько вхождений, но должен соответствовать этому шаблону) inferno/cache/mirage (допускается несколько вхождений)
До сих пор я сделал большую часть этого, но я просмотрел несколько SO и других веб-сайтов, которые рассказывают мне, как откорректировать диапазон чисел. Часть, с которой у меня возникают проблемы, это часть времени. У меня было одно регулярное выражение, которое позволяло 1:00, но я не мог понять, как также разрешить только число как 1 или 2 и нет :00
в конце. Поэтому я хотел понять это немного больше, поэтому я решил сделать это проще и просто делать цифры 1-12.
Вот мой текущий шаблон:
const scrimFormatPattern = /(((mon|fri|sun)(day)?|tue(sday)?|wed(nesday)?|thu(rsday)?|sat(urday)?)+ ((0?[1-9]|1[0-2])-(0?[1-9]|1[0-9]|2[0-9]|3[0-1]))+ ([1-9]|1[012])+ .*((inferno)|(nuke)|(mirage)|(dust2)|(train)|(overpass)|(cache)|\/))/gims
Все будет работать, но часть времени. Даже этот простой, который занимает только время ([1-9]|1[012])
, он не перестает работать, когда я вставляю 13.
РЕДАКТИРОВАТЬ Да, я знаю, что у меня есть диапазон номеров для части даты, я пытался взять эту логику и использовать ее со временем, но она все еще не работает.
РЕДАКТИРОВАТЬ 2 вот код, который я использую для проверки на совпадение, это бот разногласий, поэтому msg.content
- это просто строка, которую пользователь ввел в разногласиях.
let result = msg.content.match(scrimFormatPattern)
РЕДАКТИРОВАТЬ 3 вот образец ввода, который не потерпел неудачу этот шаблон wed 1-9 13 inferno
РЕДАКТИРОВАТЬ 4 Я думаю, что я в хорошем месте, но не могу найти регулярное выражение для нескольких записей, вот последний шаблон:
const scrimFormatPattern =/(((mon|fri|sun)(day)?|tue(sday)?|wed(nesday)?|thu(rsday)?|sat(urday)?)+ ((0?[1-9]|1[0-2])-(0?[1-9]|1[0-9]|2[0-9]|3[0-1]))+ ((1[012])(:|| )(00|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])??[aApP]m|(1[012])(:|| )(00|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])?)+ ((inferno)|(nuke)|(mirage)|(dust2)|(train)|(overpass)|(cache)|\/))/gims
если вы делаете
wed 1-9 13:00 inferno
это потерпит неудачу (как и должно быть)
но если вы делаете
wed 1-9 12 13:00 inferno
это пройдет (как не должно)
Я думаю, что ваше регулярное выражение было слишком сложным, попробуйте это:
((mon|fri|sun)(day)?|tue(sday)?|wed(nesday)?|thu(rsday)?|sat(urday)?) (0?[1-9]|1[0-2])-([0-2]?[1-9]|3[0-1]) (0?[1-9]|1[012])([: ][0-5]?[0-9])? ?[aApP]m (inferno|nuke|mirage|dust2|train|overpass|cache|\/)
Найти демо здесь
Вокруг было разбросано слишком много плюсовых квантификаторов, а в середине вы без нужды дублировали некоторые паттерны.
С помощью регулярных выражений вы должны быть очень осторожны в захвате вещей, которые вам не нужны, и тщательно продумывать крайние случаи, особенно желательные негативные.
РЕДАКТИРОВАТЬ
это решает требование нескольких частей времени?
((mon|fri|sun)(day)?|tue(sday)?|wed(nesday)?|thu(rsday)?|sat(urday)?) (0?[1-9]|1[0-2])-([0-2]?[1-9]|3[0-1]) ((0?[1-9]|1[012])([: ][0-5]?[0-9])? ?[aApP]m )+(inferno|nuke|mirage|dust2|train|overpass|cache|\/)
демо здесь
РЕДАКТИРОВАТЬ 2 (исправить на 10 и 20 дней)
((mon|fri|sun)(day)?|tue(sday)?|wed(nesday)?|thu(rsday)?|sat(urday)?) (0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[0-1]) ((0?[1-9]|1[012])([: ][0-5]?[0-9])? ?[aApP]m )+(inferno|nuke|mirage|dust2|train|overpass|cache|\/)
демо здесь
(2[0-3]|[01]?[0-9]):?([0-5]?[0-9])?
...