使用egrep进行正则表达式检查String

时间:2012-12-26 14:31:48

标签: pattern-matching ksh grep sunos

我必须针对日期格式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_timestamp的内容,否则将null返回给变量temp

此代码段是否按照unix标准进行了优化?

1 个答案:

答案 0 :(得分:0)

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

标准与良好的工作代码有时也不一致(不常见)。

我可以想到代码中至少有3个问题,甚至是reg表达式,作为我想要开发的开发人员都会被覆盖。

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

  2. 可维护吗?详细说明你认为正则表达式如何工作的一系列评论将对那些追随你的人有所帮助,或者甚至是从现在起6个月后对你自己有所帮助,你从未看过reg-exp。

  3. 性能。是否存在备用"短语"仍然给出正确答案的正则表达式,但"运行"快?

  4. 根据你的定义,考虑你的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 regexps不支持()分组(I& #39;我几乎可以肯定。)

    IHTH