Regex KornShell-脚本中的日期验证

Regex KornShell-脚本中的日期验证,regex,unix,shell,ksh,Regex,Unix,Shell,Ksh,我正在尝试验证仅作为数字输入的日期(例如,09042009作为09/04/2009) 代码现在检查日期的长度 我如何不仅验证日期条目的长度,而且验证它是否为真实日期?组合测试和正则表达式的语法是什么 按现有代码编写: echo "Please enter the date you want (e.g. 07142009)" level=1; while [ $level -gt 0 ]; do read date; dateleng=`expr length $d

我正在尝试验证仅作为数字输入的日期(例如,09042009作为09/04/2009)

代码现在检查日期的长度

我如何不仅验证日期条目的长度,而且验证它是否为真实日期?组合测试和正则表达式的语法是什么

按现有代码编写:

echo "Please enter the date you want (e.g. 07142009)"
level=1;
while [ $level -gt 0 ]; do
        read date;
        dateleng=`expr length $date`
        if [ dateleng -ne 8 ]; then
                echo "Bad date, please re-enter"; 
                else level=0;
        fi
done

这是在旧Unix系统上的KornShell(ksh)中

有帮助吗?

呼叫
date-d$date


看看它是否返回错误。

好吧,如果你真的想作为一个单正则表达式来执行,而你又不在乎闰年,那么试试这个:

^(((0[469])|(1[1]))((0[1-9])|([12][0-9])|(30))|((0[13578])|(1[02]))((0[1-9])|([12][0-9])|(3[01]))|(02)((0[1-9])|(1[0-9])|(2[0-8])))[0-9]{4}$ ^(((0[469])|(1[1]))((0[1-9])|([12][0-9])|(30))|((0[13578])|(1[02]))((0[1-9])|([12][0-9])|(3[01]))|(02)((0[1-9])|(1[0-9])|(2[0-8])))[0-9]{4}$
编写一个接受日期作为参数并填充struct tm结构的小型C程序。然后使用标准C库例程格式化日期,并将其与输入日期字符串进行比较

#include <time.h>
main(int argc, char *argv[])
{
 struct tm tmx, *tm2;
    char tmbuf[9];
    time_t timet;
    if (argc < 1)
       exit(2);
    tmx.tm_sec = tmx.tm_min = tmx.tm_hour = tmx.tm_mday = tmx.tm_mon = 
    tmx.tm_year = tmx.tm_wday = tmx.tm_yday = tmx.tm_isdst = 0;
    tmx.tm_mon = (argv[1][0] - '0') * 10 + argv[1][1] - '0' - 1;
    tmx.tm_mday = (argv[1][2] - '0') * 10 + argv[1][3] - '0';
    tmx.tm_year = atoi(&argv[1][4]) - 1900;
    if ((timet = mktime(&tmx)) != (time_t)-1) {
        tm2 = localtime(&timet);
        strftime(tmbuf, sizeof(tmbuf), "%m%d%Y", tm2);
        if (strcmp(argv[1], tmbuf) == 0)
            exit(0);
    }
    exit(1);
}
/*
cc valdate.c -o valdate
*/

你需要用ksh做吗?执行以下操作非常常见:if echo“$TEXT”| perl-pe“test and exit 1”;然后echo$TEXT通过测试;fi测试是一些有用的字符串测试。我相信有不止一种方法可以剥这只猫的皮。你们有一个perl中的单行正则表达式的例子可以做到这一点吗?这取决于——你们关心闰年吗?是的!这帮助我了解了KSH逻辑运算符和=-a和OR=-o的语法(至少在SH中,不确定它们是否会转移到我的KSH中)我的“date”不喜欢这样:>date-d09042009 date:-d非法选项用法:date[-u][+format]date[-u][-t[[CC]yymddhhmm[.SS]| MMDDhhmm[YY]]哦,我没意识到这个选项不是万能的。对此我很抱歉。这是一个很容易解决的问题!
echo "Please enter the date you want (e.g. MMDDYYYY)"
read date
if valdate "$date"; then
    echo "Bad date ($date), please re-enter"
fi