Не могу получить регулярное выражение для ограничения на основе диапазона номеров

1

У меня проблемы с настройкой регулярного выражения для соответствия определенному формату. Вот желаемый формат:

Понедельник (любой день недели) 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

это пройдет (как не должно)

  • 0
    Попробуйте это для своего совпадения времени (2[0-3]|[01]?[0-9]):?([0-5]?[0-9])? ...
  • 0
    @ звон только 12 часов
Показать ещё 5 комментариев
Теги:

1 ответ

0
Лучший ответ

Я думаю, что ваше регулярное выражение было слишком сложным, попробуйте это:

((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|\/)

демо здесь

  • 0
    Это хорошо, но это не позволяет использовать несколько раз или карты, моя старая позволяла использовать несколько карт, и у меня были проблемы с ним, когда я пытался сделать это несколько раз, но кажется, что он всегда будет проходить, даже если у меня было «13» в качестве во второй раз, но если 13 был первый раз, он потерпит неудачу, см. мое редактирование 4
  • 0
    Не беспокойтесь, подобно тому, что я сделал в демонстрационной ссылке, вам нужно показать список подходящих и не совпадающих строковых шаблонов, которые охватывают все ваши случаи. Очень сложно угадать, что приемлемо, а что нет, только из текстового описания. Вы говорите, что хотите сопоставить несколько раз, что вполне возможно, но думаете о том, как вы хотите, чтобы это выглядело и анализировалось.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню