Regex 带有shopt-s extglob的bash正则表达式
我希望验证输入,如下所示:Regex 带有shopt-s extglob的bash正则表达式,regex,bash,validation,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"; d
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
还有没有更好、更简洁的方法来指定这个正则表达式呢?请尝试以下表达式:
^-[[:digit:]]{1,3}(\.[[:digit:]]{1,4})?[[:space:]](days?|hours?|minutes?|seconds?)$
您不需要为空格指定{1}
如果您只想在几秒钟内使用小数,那么它会更难看(您可以将
\d
替换为[:digit:]
,将\s
替换为[:space:]
):
因此,模式将是(如果希望确保所有秒值都应该有贴花,请将\?\d{0,4}
改为\。\d{1,4}
):
这将允许
NNN.NNNN小时
。我希望只允许在第二个示例中使用小数。实际上,替换了\d
和\s
的示例对我不起作用。但是另一个使用char类的方法工作得很好。shopt-s extglob
仅在使用?()进行匹配时才是必需的!(),…
^-\d{1,3}((\.?\d{0,4})?\ssecond|\s(day|hour|minute))s?$
^-[[:digit:]]{1,3}((\.?[[:digit:]]{0,4})?[[:space:]]second|[[:space:]](day|hour|minute))s?$