0

我必须针对日期格式的正则表达式验证字符串YYYYMMddhhmmss

我已经测试了以下代码:

temp=echo $file_timestamp | egrep '^(20)[0-9][0-9](0[1-9]|1[012])(0[1-9]|[12][0-9]|3[01])(0[0-9]|1[0-9]|2[0123])([0-5])[0-9]([0-5])[0-9]$';

以下返回file_timestampif 满足模式的内容,否则返回null变量temp

此代码片段是否根据 unix 标准进行了优化?

4

1 回答 1

0

不会有明确解决您的问题的 unix 标准。

此外,标准与良好的工作代码有时会发生冲突(不是那么频繁)。

我可以想到至少 3 个关于代码的问题,甚至是 reg 表达式,作为开发人员,我想做的这些问题都被涵盖了。

  1. 结果正确吗?这只有你能知道。将您的代码构建为测试驱动开发并不是只有 java 人可以做的事情。制作一个包含您认为应该支持的输入范围的文件,并确保输出适用于所有情况,如果这确实是一个大项目,请有错误消息显示未处理的内容。

  2. 是否可维护?一组详细说明您认为正则表达式如何工作的评论将对您之后的人有所帮助,甚至对您 6 个月后的您也有帮助,而您从那以后就没有看过 reg-exp。

  3. 表现。是否存在仍然给出正确答案但“运行”更快的正则表达式的替代“措辞”?

考虑到你的定义,我想我会以你的 reg-exp 做不同的事情。请注意,此版本更短,因此通过一个非常简单的指标,它更易于维护。

temp=$(echo $file_timestamp \
| egrep '^20[0-9][0-9][0-1][0-9][0-3][1-9][0-2][0-9][0-5][0-9][0-5][0-9]$'
)

除非您愿意解释您对( .... )分组字符的使用,否则我认为它们没有任何用处。

(我唯一能想到的是您指定的格式YYYYMMddhhmmss比您指出的更灵活。您没有尝试匹配用户可能输入的任何日期格式,即 YYYYMdhms (当任何一个前导零时元素?。当心,这是进入您系统的疯狂和不正确数据的途径!;-)

最后,您没有说明如何在验证中使用 $temp。我认为验证现有变量(并且更灵活)的一种更简单的方法是使用 case 语句。尝试

 case ${file_timestamp) in
     20[0-9][0-9][0-1][0-9][0-3][1-9][0-2][0-9][0-5][0-9][0-5][0-9] )
       print -u2 -- "dbg: valid : file_timestamp=${file_timestamp}"
       # do other good stuff here
     ;;
     * )
       print -u2 -- "dbg:NOT valid : file_timestamp=${file_timestamp} "
       # do other error reporting or fixing here
     ;;
   esac

现在您避免了 $( ... ) 和grep.

如果您需要像 一样的分组字符(2[0-9]),那么您将不得不使用 grep(sed、awk 等),因为 ksh 正则表达式不支持()分组(我几乎可以肯定)。

IHTH

于 2012-12-26T22:21:39.767 回答