UNIX中的日期正则表达式

时间:2014-03-02 23:43:21

标签: regex date unix

我正在尝试编写正则表达式来验证 Unix 中的日期。与通常格式的日期匹配的正则表达式是mm / dd / yy

例如,它应该匹配03/20/98或11/08/89但不匹配13/40/99

我设法在Regular Expression to match valid dates上找到了答案,但表达式在UNIX上无效。

当我尝试验证日期

时,正则表达式无效 回声'12 / 01/2014'| grep'^(((0 [13578])|([13578])|(1 [02]))/)|(((0 [469])|([469])|(11))/) |((2 | 02)/))[/] \ d {4} $ | ^ \ d {4} $'

不匹配

echo'2 / 1/2014'| grep'^(((0 [13578])|([13578])|(1 [02]))/)|(((0 [469])|([469])|(11))/) |((2 | 02)/))[/] \ d {4} $ | ^ \ d {4} $'

不匹配

1 个答案:

答案 0 :(得分:1)

有几种正则表达式格式;您可能正在尝试使用标准或扩展正则表达式,但使用链接答案中的PCRE。

正如所接受的答案所暗示的那样,仅使用正则表达式就不容易进行日期验证。如果您可以接受不完整的验证,那么这个简单的验证似乎通过了我的测试(请注意egrep而不仅仅grep使用(a|b)语法:

for date in `cat dates.txt` ; do 
if (echo $date |\
    egrep '^(1[0-2]|0[0-9])[-/]([0-2][0-9]|3[0-1])[-/][0-9]{2}' > /dev/null
); then 
       echo "$date is valid"
   else 
       echo "$date is invalid" 
   fi
done

给我:

01-01-48 is valid
13-01-99 is invalid
02-30-03 is valid
03-32-14 is invalid

但是,正如许多人在另一个帖子中所说的那样,用于验证一个月和闰年天数的正则表达式变得很复杂。此正则表达式仅验证日期的每个部分本身是否有效 - 它不验证月中存在月中的某天。这就是它认为02-30-03是有效日期的原因。