Go的template模板关于range换行和crontab的简单正则表达式

警告
本文最后更新于 2021-04-04,文中内容可能已过时。
1
2
3
4
5
{
  {{ range $_, $cron := .CronList }}
  {{- $cron }}
  {{ end }}
} >> /scripts/docker/merged_list_file.sh

效果如下图:

https://pic.yqqy.top/blog/20210404174920.png
图一

出现了一行空白,接着修改如下:

1
2
3
4
5
{
  {{ range $_, $cron := .CronList }}
  {{- $cron }}
  {{ end -}}
} >> /scripts/docker/merged_list_file.sh

https://pic.yqqy.top/blog/20210404175051.png
图2

正确修改方式如下,这个坑还是不少人会踩到:

1
2
3
4
5
{
  {{- range $_, $cron := .CronList}}
  {{ $cron -}}
  {{- end }}
} >> /scripts/docker/merged_list_file.sh

https://pic.yqqy.top/blog/20210404175205.png
图三

周末写工具自动拉取几个作者的脚本遇到需要提取脚本中的crontab表达式,研究了一下正则,因为我发现不同作者写脚本方式不一样,所以最稳的还是正则来匹配,之所以称为简单匹配,是因为没有做成真正的crontab是否有效的匹配,只是匹配格式,代码如下:

1
2
3
4
5
6
7
8
\*                                       // 匹配*
\?                                       // 匹配?
[0-9]{1,2}                               // 匹配单个时间
[0-9]{1,2}\-[0-9]{1,2}                   // 匹配时间段
[0-9]{1,2}\-[0-9]{1,2}\/[0-9]{1,2}       // 匹配每隔多久的时间段
([0-9]{1,2}\,?)*                         // 匹配,号隔开的多个时间
([0-9]{1,2}\,?)*\-[0-9]{1,2}             // 匹配,号和-号组成的时间段
([0-9]{1,2}\,?)*\-[0-9]{1,2}\/[0-9]{1,2} // 匹配,号、-号和/号组成的间隔多个时间段

组合在一起装成出现5次,代码如下

1
(((\*|\?|[0-9]{1,2}|[0-9]{1,2}\-[0-9]{1,2}|[0-9]{1,2}\-[0-9]{1,2}\/[0-9]{1,2}|([0-9]{1,2}\,?)*|([0-9]{1,2}\,?)*\-[0-9]{1,2}|([0-9]{1,2}\,?)*\-[0-9]{1,2}\/[0-9]{1,2})+[\s]){5})

效果如下,如果有人看到了这篇文章,恰好这个正则不能匹配你的crontab,麻烦留一下正则作为我的补充。

https://pic.yqqy.top/blog/20210404175647.png
图4

2021-06-05更新最新的crontab表达式

1
[^\s\:]((\*|[0-9]{1,2}|[0-9]{1,2}\-[0-9]{1,2}|[0-9]{1,2}\-[0-9]{1,2}\/[0-9]{1,2}|([0-9]{1,2}\,?)*|([0-9]{1,2}\,?)*\-[0-9]{1,2}|([0-9]{1,2}\,?)*\-[0-9]{1,2}\/[0-9]{1,2})+[ ]){4}(\*|[0-9]{1,2}|[0-9]{1,2}\-[0-9]{1,2}|[0-9]{1,2}\-[0-9]{1,2}\/[0-9]{1,2}|([0-9]{1,2}\,?)*|([0-9]{1,2}\,?)*\-[0-9]{1,2}|([0-9]{1,2}\,?)*\-[0-9]{1,2}\/[0-9]{1,2})

2022-12-25更新最新的crontab表达式(支持6位)

1
(((\*(/\d+)?|((\d+(-\d+)?)(,\d+(-\d+)?)*))(/\d+)?)\s+(\*(/\d+)?|((\d+(-\d+)?)(,\d+(-\d+)?)*))(/\d+)?\s+(\*(/\d+)?|((\d+(-\d+)?)(,\d+(-\d+)?)*))(/\d+)?\s+(\*(/\d+)?|((\d+(-\d+)?)(,\d+(-\d+)?)*))(/\d+)?\s+(\*(/\d+)?|((\d+(-\d+)?)(,\d+(-\d+)?)*))(/\d+)?\s+(\*(/\d+)?|((\d+(-\d+)?)(,\d+(-\d+)?)*))(/\d+)?)