我有以下正则表达式:
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
可以帮忙吗? 谢谢
答案 0 :(得分:5)
问题出在(?:(?:(1st|2nd|3rd|4th|5th))? ?(monday|tuesday|wednesday|thursday|friday|saturday|sunday)?)
部分:它可能与一个空字符串匹配。因此,它总是“赢”。
您可以通过删除?
之后的sunday)
量词来解决此问题,以使星期几成为强制性模式。参见this regex demo。
否则,如果使用正则表达式检查的字符串是独立的,则可以用^(?:
和)$
模式将整个模式括起来,以使它们与整个模式匹配。参见this regex demo。
答案 1 :(得分:1)
也许是矫over过正,但是我认为如果您替换了正则表达式的这一部分:
router.register(r'cityevents', CityEventsViewSet)
通过这样的东西:
(1st|2nd|3rd|4th|5th)
...您可能会实现所需的匹配模式。我的想法是涵盖从1日到999日的所有序数。
请注意,我尚未测试过此正则表达式,因此可能需要进行一些更正。
另外,请考虑@Wictor的回答:如果您正在多个字符串而不是单个多字符串上搜索这些模式(换句话说,您要检查的所有字符串都将像示例中的那样),之前和之后没有任何其他字符),将您的正则表达式包装在(([1-9]?([2-90](((1st)|(2nd)|(3rd)|([4-90]th))|(1[0-9]th))))|((1st)|(2nd)|(3rd)|([4-9]th)))
和^
之间将有助于使正则表达式更加准确。
而且,正如@Wictor在他的回答中所说,如果某些子模式接受空字符串作为匹配项,则它的行为可能异常。详尽的反复试验可能有助于发现这些缺陷,以便纠正它们。