Bash脚本正则校验HH:MM:SS AM/PM时间格式失败求助
问题根因
你遇到的校验失败有两个明确的错误点:
- Bash的
=~正则匹配运算符使用POSIX扩展正则规则,不支持PCRE语法中的\s空白匹配符,你写的\s无法被正确识别 - 你尝试的POSIX字符类写法有误,
[[:space]]/[[:blank]]缺少末尾的闭合冒号,正确写法为[[:space:]](匹配所有空白字符,含换行、制表符)、[[:blank:]](仅匹配空格和制表符)
解决方案
你可以直接用普通空格匹配(如果你的场景中时间和AM/PM之间就是普通空格,不需要兼容其他空白字符,这是最简单的写法),也可以用正确的POSIX字符类写法,修正后的代码如下:
#!/usr/bin/env bash # date="$1" time="$2" if [[ $date =~ ^(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])$ ]]; then # 两种写法二选一即可: # 写法1:直接匹配普通空格 if [[ $time =~ ^(0[1-9]|1[0-2]):([0-5][0-9]):([0-5][0-9]) ([AaPp][Mm])$ ]]; then # 写法2:兼容制表符等空白,用正确的POSIX字符类 # if [[ $time =~ ^(0[1-9]|1[0-2]):([0-5][0-9]):([0-5][0-9])[[:blank:]]([AaPp][Mm])$ ]]; then echo "Input Matched!" else echo "Invalid time! Use <HH:MM:SS AM/PM> format!" exit 1 fi else echo "Invalid date! Use <MMDD> format!" exit 1 fi
相关搜索关键词
你可以用以下关键词找到同类问题的解决方案:
- bash正则空格匹配失败
- bash =~ 运算符不支持\s
- POSIX正则空白字符类写法
内容的提问来源于stack exchange,提问作者Justin Paro
相关产品推荐
相关产品推荐

