bash正则表达式与shopt -s extglob

时间:2014-07-27 12:15:15

标签: regex bash validation

我想验证输入,如下所示:

NNN days
NNN hours
NNN minutes
NNN.NNNN seconds

,它必须是负值,所以前缀为-,复数是可选的。

我的脚本中有shopt -s extglob,我正在使用它:

while read;do [[ $REPLY =~ ^-[[:digit:]]{1,3}+[[:space:]]{1}(days?|hours?|minutes?|seconds?)$ ]] && echo "GOOD" || echo "BAD"; done

我如何实现秒的不同规则NNN.NNNN

还有一种更好,更清晰的方法来指定这个正则表达式,从我已经在做什么?

1 个答案:

答案 0 :(得分:1)

尝试以下表达式:

^-[[:digit:]]{1,3}(\.[[:digit:]]{1,4})?[[:space:]](days?|hours?|minutes?|seconds?)$

您无需为空格指定{1}


如果您希望秒数,那么它就会变得更加丑陋(您可以将\d替换为[[:digit:]]而将\s替换为{{ 1}}):

[[:space:]]

因此,模式将是(如果您想确保所有秒值都应该贴花,请改为^-\d{1,3}((\.?\d{0,4})?\ssecond|\s(day|hour|minute))s?$ 改为\.?\d{0,4}):

\.\d{1,4}