我想验证输入,如下所示:
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
?
还有一种更好,更清晰的方法来指定这个正则表达式,从我已经在做什么?
答案 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}