我需要编写一个正则表达式来搜索字符串
中的所有这些可能性我在想这样的事情:[28 *] [2 *] [7 *] [1 *] [1 *]但是这不起作用。 有任何想法吗?
答案 0 :(得分:11)
我刚写完一篇,所以这是我的,希望它有所帮助。
这应该允许*或* / num并且还将数值限制到它们的逻辑范围(月份为1-12,小时为0-24,依此类推)
/^(\*|([0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])|\*\/([0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])) (\*|([0-9]|1[0-9]|2[0-3])|\*\/([0-9]|1[0-9]|2[0-3])) (\*|([1-9]|1[0-9]|2[0-9]|3[0-1])|\*\/([1-9]|1[0-9]|2[0-9]|3[0-1])) (\*|([1-9]|1[0-2])|\*\/([1-9]|1[0-2])) (\*|([0-6])|\*\/([0-6]))$/
答案 1 :(得分:10)
如果不知道你将使用哪个程序来运行它,很难制作一个完全正则表达式,但这应该有效:
(28|\*) (2|\*) (7|\*) (1|\*) (1|\*)
答案 2 :(得分:5)
我花了一些时间:D根据此文档进行验证:http://en.wikipedia.org/wiki/Cron 但是,它没有考虑到您不能指定星期几和星期几,即您可以根据此正则表达式指定两者。这可以用于boost :: regex
(((([*])|(((([0-5])?[0-9])((-(([0-5])?[0-9])))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))(,(((([*])|(((([0-5])?[0-9])((-(([0-5])?[0-9])))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?)))* (((([*])|(((((([0-1])?[0-9]))|(([2][0-3])))((-(((([0-1])?[0-9]))|(([2][0-3])))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))(,(((([*])|(((((([0-1])?[0-9]))|(([2][0-3])))((-(((([0-1])?[0-9]))|(([2][0-3])))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?)))* (((((((([*])|(((((([1-2])?[0-9]))|(([3][0-1]))|(([1-9])))((-(((([1-2])?[0-9]))|(([3][0-1]))|(([1-9])))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))|(L)|(((((([1-2])?[0-9]))|(([3][0-1]))|(([1-9])))W))))(,(((((([*])|(((((([1-2])?[0-9]))|(([3][0-1]))|(([1-9])))((-(((([1-2])?[0-9]))|(([3][0-1]))|(([1-9])))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))|(L)|(((((([1-2])?[0-9]))|(([3][0-1]))|(([1-9])))W)))))*)|([?])) (((([*])|((((([1-9]))|(([1][0-2])))((-((([1-9]))|(([1][0-2])))))?))|((((JAN)|(FEB)|(MAR)|(APR)|(MAY)|(JUN)|(JUL)|(AUG)|(SEP)|(OKT)|(NOV)|(DEC))((-((JAN)|(FEB)|(MAR)|(APR)|(MAY)|(JUN)|(JUL)|(AUG)|(SEP)|(OKT)|(NOV)|(DEC))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))(,(((([*])|((((([1-9]))|(([1][0-2])))((-((([1-9]))|(([1][0-2])))))?))|((((JAN)|(FEB)|(MAR)|(APR)|(MAY)|(JUN)|(JUL)|(AUG)|(SEP)|(OKT)|(NOV)|(DEC))((-((JAN)|(FEB)|(MAR)|(APR)|(MAY)|(JUN)|(JUL)|(AUG)|(SEP)|(OKT)|(NOV)|(DEC))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?)))* (((((((([*])|((([0-6])((-([0-6])))?))|((((SUN)|(MON)|(TUE)|(WED)|(THU)|(FRI)|(SAT))((-((SUN)|(MON)|(TUE)|(WED)|(THU)|(FRI)|(SAT))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))|((([0-6])L))|(W)|(([#][1-5]))))(,(((((([*])|((([0-6])((-([0-6])))?))|((((SUN)|(MON)|(TUE)|(WED)|(THU)|(FRI)|(SAT))((-((SUN)|(MON)|(TUE)|(WED)|(THU)|(FRI)|(SAT))))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))|((([0-6])L))|(W)|(([#][1-5])))))*)|([?]))((( (((([*])|((([1-2][0-9][0-9][0-9])((-([1-2][0-9][0-9][0-9])))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?))(,(((([*])|((([1-2][0-9][0-9][0-9])((-([1-2][0-9][0-9][0-9])))?)))((/(([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?([0-9])?[0-9])))?)))*))?)
答案 3 :(得分:5)
要大致验证cron表达式 ,它在很大程度上取决于您使用的具体实现
通常,大多数人遵循以下格式:
| Field name | Mandatory? | Allowed values | Special characters |
| ------------- | ---------- | --------------- | ------------------ |
| Seconds | No* | 0-59 | * / , - |
| Minutes | Yes | 0-59 | * / , - |
| Hours | Yes | 0-23 | * / , - |
| Day of month | Yes | 1-31 | * / , - L W |
| Month | Yes | 1-12 or JAN-DEC | * / , - |
| Day of week | Yes | 0-6 or SUN-SAT | * / , - L # |
| Year | No* | 1970–2099 | * / , - |
*其中秒和年是非标准的,有时不包括在内
某些口味允许这样的预定义时间段:
| Entry | Equivalent to |
| ---------- | ------------- |
| @annually | 0 0 0 1 1 * * |
| @yearly | 0 0 0 1 1 * * |
| @monthly | 0 0 0 1 * * * |
| @weekly | 0 0 0 * * 0 * |
| @daily | 0 0 0 * * * * |
| @hourly | 0 0 * * * * * |
| @reboot | |
某些样式允许将@every <duration>
语法与以下时间跨度单位一起使用:
| Unit | Definition |
| ------ | ----------- |
| ns | nanosecond |
| us, µs | microsecond |
| ms | millisecond |
| s | second |
| m | minute |
| h | hour |
要验证预定义的宏,可以使用following regex:
/@(annually|yearly|monthly|weekly|daily|hourly|reboot)/
哪些将通过以下测试用例:
@daily
@hourly
@every
正则表达式要验证@every
的持续时间,可以使用following regex:
/@every (\d+(ns|us|µs|ms|s|m|h))+/
哪些将通过以下测试用例:
@every 5s
@every 20h30m
在正则表达式中验证cron术语有点棘手,因为存在很多变体。
只关注一个词,以下内容均有效:
,
/
或-
隔开*
要验证单个术语,我们可以使用following regex:
/(\d+,)+\d+|(\d+(\/|-)\d+)|\d+|\*/
,其中\d+
仅保证您拥有1个或多个数字
哪些将通过以下测试用例:
1,2,3
1,2
1/2
1-2
1
*
要检查完整的表达式,我们只需确保我们有{5,7}
项和following regex:
/(((\d+,)+\d+|(\d+(\/|-)\d+)|\d+|\*) ?){5,7}/
如果我们想区分每个术语,则需要validate numbers within a certain range:
| Allowed values | Regex |
| -------------- | ------------------------- |
| 0-59 | [1-5]?[0-9] |
| 0-23 | 2[0-3]|1[0-9]|[0-9] |
| 1-31 | 3[01]|[12][0-9]|[1-9] |
| 1-12 | 1[0-2]|[1-9] |
| 0-6 | [0-6] |
| 1970–2099 | 19[7-9][0-9]|20[0-9][0-9] |
但是,如果我们只是想确保看起来像regex表达式,而不必担心哪个术语是天数还是小时数,则该表达式会保持整洁,这就是我要做的为简单起见
通过结合以上语句,我们可以进行一个相对简单的健全性检查,以使该术语看起来像following expression的正则表达式:
/(@(annually|yearly|monthly|weekly|daily|hourly|reboot))|(@every (\d+(ns|us|µs|ms|s|m|h))+)|((((\d+,)+\d+|(\d+(\/|-)\d+)|\d+|\*) ?){5,7})/
答案 4 :(得分:1)
/^((((\d+,)+\d+|(\d+(\/|-|#)\d+)|\d+L?|\*(\/\d+)?|L(-\d+)?|\?|[A-Z]{3}(-[A-Z]{3})?) ?){5,7})$/
在以下位置进行测试:https://regexr.com/5bdes
使用(?:
隐藏组。
^(?:(?:(?:(?:\d+,)+\d+|(?:\d+(?:\/|-|#)\d+)|\d+L?|\*(?:\/\d+)?|L(?:-\d+)?|\?|[A-Z]{3}(?:-[A-Z]{3})?) ?){5,7})$
/^((((\d+,)+\d+|(\d+(\/|-|#)\d+)|\d+L?|\*(\/\d+)?|L(-\d+)?|\?|[A-Z]{3}(-[A-Z]{3})?) ?){5,7})$|(@(annually|yearly|monthly|weekly|daily|hourly|reboot))|(@every (\d+(ns|us|µs|ms|s|m|h))+)/
# At 12:00 pm (noon) every day during the year 2017:
0 0 12 * * ? 2017
# Every 5 minutes starting at 1 pm and ending on 1:55 pm and then starting at 6 pm and ending at 6:55 pm, every day:
0 0/5 13,18 * * ?
# Every minute starting at 1 pm and ending on 1:05 pm, every day:
0 0-5 13 * * ?
# At 1:15 pm and 1:45 pm every Tuesday in the month of June:
0 15,45 13 ? 6 Tue
# At 9:30 am every Monday, Tuesday, Wednesday, Thursday, and Friday:
0 30 9 ? * MON-FRI
# At 9:30 am on 15th day of every month:
0 30 9 15 * ?
# At 6 pm on the last day of every month:
0 0 18 L * ?
# At 6 pm on the 3rd to last day of every month:
0 0 18 L-3 * ?
# At 10:30 am on the last Thursday of every month:
0 30 10 ? * 5L
# At 6 pm on the last Friday of every month during the years 2015, 2016 and 2017:
0 0 18 ? * 6L 2015-2017
# At 10 am on the third Monday of every month:
0 0 10 ? * 2#3
# At 12 am midnight on every day for five days starting on the 10th day of the month:
0 0 0 10/5 * ?
答案 5 :(得分:1)
这是我的解决方案,因为我发现了这个问题并且答案不符合我的目的。这个 .NET 正则表达式有条件地解析 5-7 部分的 cron 语句,包括(afaik)我见过的大多数特殊字符,并且只会填充任何长度的正确捕获(秒组等)。它也不会尝试验证日期输入的数字,即。您可以输入第 67 分钟,这是更详细的,我简化了可读性。它也没有固定在任何地方,您可能需要在行尾进行一些懒惰的匹配以干净地捕获倍数,但我将其去掉以免混淆。
你会希望这是多行的,忽略空格,显式捕获。
((?<seconds>\*|([0-5]?[0-9])((-|,|\/)?([0-5]?[0-9])?)+)[ \t]+)?(?#seconds)
(?<minutes>\*|([0-5]?[0-9])((-|,|\/)?([0-5]?[0-9])?)+)[ \t]+(?#minutes)
(?<hours>\*|([0-2]?[0-9])((-|,|\/)?([0-2]?[0-9])?)+)[ \t]+(?#hours)
(?<dom>\*|\?|L|([1-2]?[0-9])((-|,|\/)?([1-2]?[0-9])?)+)\s(?#dayofmonth)
(?<month>((\*)|(1?[0-9])|(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC))((\/|,|-|\#)((\*)|(1?[0-9])|(JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)))?)\s(?#month)
(?<dow>(\*|\?|L|(MON|TUE|WED|THU|FRI|SAT|SUN)|[1-7])((-|,|\/|L|W|C|\#)?((MON|TUE|WED|THU|FRI|SAT|SUN)|[1-7])?)+)\s(?#day of week)
(?(seconds)(?<year>([1-2][0-9]{3})((,|-|\/)([1-2][0-9]{3}))?)?)(?#year, cond on seconds match)
答案 6 :(得分:1)
@KyleMit 的答案是一个很好的起点,但我发现他的正则表达式也捕获了一些 invalid use-cases 像:
所以我更新了他的正则表达式:
/(@(annually|yearly|monthly|weekly|daily|hourly|reboot))|(@every (\d+(ns|us|µs|ms|s|m|h))+)|(^((?!\*-)((\d+,)+\d+|([\d\*]+(\/|-)\d+)|\d+|(?<!\d)\*(?!\d)) ?){5,7})/
答案 7 :(得分:0)
您当前的正则表达式只匹配5个字符,因为每个字符类只能匹配一个字符。对于您希望匹配数字或*
的每个职位,每个职位之间有一个或多个空格,您可以使用以下内容执行此操作:
(28|\*) +[2*] +[7*] +[1*] +[1*]
请注意,由于第一个数字有两位数,因此您需要使用替换而不是字符类。
您可能还想在正则表达式中添加一些锚点,使其与字符串的一部分不匹配,如果有必要,请将^
添加到开头,将$
添加到结尾
答案 8 :(得分:0)
不确定这是否可以帮助某人,但是这里有一些正则表达式来检查时间参数值而没有写出工作日名称的功能。
//string validation
function allowed_characters($value, $mode){
switch ($mode) {
case '0': //0-59
$preg_code = "^(((([0-5]?[0-9]|60)(-([0-5]?[0-9]|60)){0,1}?)|\*)(,([0-5]?[0-9]|60)((-([0-5]?[0-9]|60)){0,1}?))*?)$";
break;
case '1': //0-23
$preg_code = "^(((([0-1]?[0-9]|2[0-4])(-([0-1]?[0-9]|2[0-4])){0,1}?)|\*)(,([0-1]?[0-9]|2[0-4])((-([0-1]?[0-9]|2[0-4])){0,1}?))*?)$";
break;
case '2': //1-31
$preg_code = "^(((([0-2]?[0-9]|3[0-1])(-([0-2]?[0-9]|3[0-1])){0,1}?)|\*)(,([0-2]?[0-9]|3[0-1])((-([0-2]?[0-9]|3[0-1])){0,1}?))*?)$";
break;
case '3': //0-12
$preg_code = "^(((([0]?[0-9]|1[0-2])(-([0]?[0-9]|1[0-2])){0,1}?)|\*)(,([0]?[0-9]|1[0-2])((-([0]?[0-9]|1[0-2])){0,1}?))*?)$";
break;
case '4': //0-6
$preg_code = "^(((([0]?[[0-7])(-([0]?[0-7])){0,1}?)|\*)(,([0]?[0-7])((-([0]?[0-7])){0,1}?))*?)$";
break;
default:
return false;
break;
}
答案 9 :(得分:0)
为避免行很长,可以分割cron字符串,然后将每个字段与以下模式匹配。 支持值范围,步骤和逗号组!
// minute: 0-59
/^(\*|[1-5]?[0-9](-[1-5]?[0-9])?)(\/[1-9][0-9]*)?(,(\*|[1-5]?[0-9](-[1-5]?[0-9])?)(\/[1-9][0-9]*)?)*$/
// hour: 0-23
/^(\*|(1?[0-9]|2[0-3])(-(1?[0-9]|2[0-3]))?)(\/[1-9][0-9]*)?(,(\*|(1?[0-9]|2[0-3])(-(1?[0-9]|2[0-3]))?)(\/[1-9][0-9]*)?)*$/
// monthDay: 1-31
/^(\*|([1-9]|[1-2][0-9]?|3[0-1])(-([1-9]|[1-2][0-9]?|3[0-1]))?)(\/[1-9][0-9]*)?(,(\*|([1-9]|[1-2][0-9]?|3[0-1])(-([1-9]|[1-2][0-9]?|3[0-1]))?)(\/[1-9][0-9]*)?)*$/
// month: 1-12
/^(\*|([1-9]|1[0-2]?)(-([1-9]|1[0-2]?))?)(\/[1-9][0-9]*)?(,(\*|([1-9]|1[0-2]?)(-([1-9]|1[0-2]?))?)(\/[1-9][0-9]*)?)*$/
// weekDay: 0-6
/^(\*|[0-6](-[0-6])?)(\/[1-9][0-9]*)?(,(\*|[0-6](-[0-6])?)(\/[1-9][0-9]*)?)*$/
它无法验证范围范围,即0,*/3,6-1/20
在这里可以接受
一个非常有用的网站,可能会帮助您:https://crontab.guru/
答案 10 :(得分:0)
没有具体的数字范围
^(?:(?:(?:\d+-\d+\/\d+|\d+(?:[-,\/]\d+)?|\*\/\d+)(?:,(?:\d+-\d+\/\d+|\d+(?:[-,\/]\d+)?|\*\/\d+))*)|\*)$
答案 11 :(得分:-1)
做最可能有效的事情
"^28 2 7 1 1$|^28 2 7 1 \*$|^28 2 7 \* \*$|^28 2 \* \* \*$|^28 \* \* \* \*$|^\* \* \* \* \*$"