Regex специфический анализатор интервалов повторения, в основном работает - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть следующее регулярное выражение:

once|every (?:(?:([1-9][0-9]?[0-9]? )?(hours?|days?))|(?:(?:(?:(1st|2nd|3rd|4th|5th))? ?(monday|tuesday|wednesday|thursday|friday|saturday|sunday)?)|((?:[1-9]|[1-2][0-9]|3[0-1])(?:st|nd|rd|th))) ?(?:(of the month)? ?(?:(?:repeated every )([2-9][0-9]?[0-9]?) (weeks|months))?)?)

Это работает для большей части того, что мне нужно, но не для следующей строки ...

Every 20th of the month

Следующая работаотлично ...

Once
Every hour
Every day
Every 2 hours
Every 2 days
Every Monday
Every 1st of the month
Every 1st of the month repeated every 3 months
Every 2nd Monday of the month
Every 2nd Monday of the month repeated every 3 months

Вы можете помочь?Спасибо

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Возможно, это излишне, но я думаю, что если вы замените эту часть вашего регулярного выражения:

(1st|2nd|3rd|4th|5th)

примерно так:

(([1-9]?([2-90](((1st)|(2nd)|(3rd)|([4-90]th))|(1[0-9]th))))|((1st)|(2nd)|(3rd)|([4-9]th)))

... вы можете достичьжелаемый образец соответствия.Моя идея заключалась в том, чтобы охватить любой порядковый номер от 1-го до 999-го.

Обратите внимание, что я не проверял это регулярное выражение , поэтому, возможно, ему понадобятся некоторые исправления.


Также рассмотрим ответ @Wictor: если вы ищете эти шаблоны по нескольким строкам, а не по одной многострочной (другими словами, все проверяемые вами строки будут такими же, как в примере, без каких-либодругой символ до и после), перенос вашего регулярного выражения между ^ и $ поможет сделать его более точным.

И, как сказал @Wictor в своем ответе, если некоторый подшаблон принимает пустую строку какматч, он может вести себя неожиданно.Исчерпывающие методы проб и ошибок могут помочь найти недостатки такого рода, чтобы исправить их.

0 голосов
/ 21 декабря 2018

Проблема с частью (?:(?:(1st|2nd|3rd|4th|5th))? ?(monday|tuesday|wednesday|thursday|friday|saturday|sunday)?): она может соответствовать пустой строке.Следовательно, он всегда «выигрывает».

Вы можете исправить это, удалив квантификатор ? после sunday), чтобы сделать день недели обязательным шаблоном.См. эту демонстрацию регулярных выражений .

Иначе, если строки, которые вы проверяете с помощью регулярных выражений, являются автономными, вы можете заключить весь шаблон с шаблонами ^(?: и )$, чтобы они соответствовали всемушаблон.См. это демо регулярных выражений .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...