我正在尝试编写正则表达式来验证 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} $'
不匹配
答案 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
是有效日期的原因。