尧舜再世 发表于 2005-3-13 00:12:14

关于判断用户输入的日期是否符合给定的日期格式的问题

给定的日期格式dd-mm-yyyy,比如12-03-2005,03-03-2005 假设每个月均为31天,年份范围为1000到9999.
      现在,要判断用户输入的一个日期是否符合上述给定的格式, 应该如何写呢? 举几个不符合的例子 99-03-2005, 12-99-2005, 12-03-0100, aa-03-2005
      注意12-03-2005与 12-3-2005的区别(前者才是完全符合给定格式的)
望各位赐教

watch_1394 发表于 2005-3-13 03:43:41

试试这个正则表达式(POSIX标准):
echo dd-mm-yyyy |egrep "(([0-2][0-9])|(3[01]))-((0[1-9])|(1[0-2]))-[1-9][0-9]{3}"

小弟初学正则表达式,班门弄斧之处请高手见谅。
当然,这个表达式也有问题,对于00-mm-yyyy的日期是匹配的。这也可以通过正则表达式解决,但是这样做下去正则表达式会难于阅读,所以我想还是用脚本解决更好。
不过Linux有点不好就是比较喜欢使用大家都看不懂的命令,所以我还是把这个写出来:
"((0[1-9])|([1-2][0-9])||(3[01]))-((0[1-9])|(1[0-2]))-[1-9][0-9]{3}"

xqssl 发表于 2005-3-13 09:19:06

下面这个脚本虽然复杂,可是可以帮助你一些额外的功能。例如检查日期格式是否合法,
可以检查出2月份里面多出来的30,31天。
这个算是容易看得懂的linux脚本了把? :)


check_date()
{
      if [ -z "$1" ] ; then
                echo "No Date"
                return 1
      fi
      VAR1=`echo "$1" | awk -F '-' '{print $3"-"$2"-"$1}'`
      if [ $? -ne 0 ] ; then
                echo "Error Date"
                return 1
      fi
      VAR2=`date -d "${VAR1}" +%F`
      if [ $? -ne 0 ] ; then
                echo "Error Date"
                return 1
      fi
      if [ "${VAR1}" != "${VAR2}" ] ; then
                echo "Error Date"
                return 1
      fi
      return 0
}
页: [1]
查看完整版本: 关于判断用户输入的日期是否符合给定的日期格式的问题