本文介绍如何使用正则表达式精确校验符合 hh:mma(如 09:00pm、1:00am)格式的 12 小时制时间字符串,提供可直接运行的 Go 示例代码、正则详解及实用注意事项。
本文介绍如何使用正则表达式精确校验符合 `hh:mma`(如 `09:00pm`、`1:00am`)格式的 12 小时制时间字符串,提供可直接运行的 go 示例代码、正则详解及实用注意事项。
在 Go 中验证 hh:mma 格式(例如 09:00pm、1:00am、12:30am)需兼顾语义正确性与格式灵活性:小时部分允许 1–12(支持省略前导零),分钟为两位 00–59,且必须以小写 am 或 pm 结尾(不区分大小写时需额外处理)。推荐使用标准库 regexp 包实现高效、可靠的校验。
✅ 推荐正则表达式(严格匹配)
^(0?[1-9]|1[012]):([0-5][0-9])[ap]m$
- ^ 和 $ 确保完整字符串匹配,避免部分匹配(如 “09:00pm extra” 被误判);
- (0?[1-9]|1[012]) 匹配小时:1–9(可选前导 0)或 10–12;
- : 字面量冒号;
- ([0-5][0-9]) 匹配分钟:十位 0–5,个位 0–9,即 00–59;
- [ap]m 匹配 am 或 pm(注意:此处为小写;若需忽略大小写,见下文)。
? Go 完整示例代码
package main
import (
"fmt"
"regexp"
)
func isValidHHMMa(s string) bool {
// 编译一次,复用提升性能(生产环境建议定义为全局变量)
re := regexp.MustCompile(`^(0?[1-9]|1[012]):([0-5][0-9])[ap]m$`)
return re.MatchString(s)
}
func main() {
testCases := []string{
"09:00pm", "09:00am", "08:55pm", "08:54am", "1:00pm",
"12:00am", "12:59pm", // 合法
"13:00am", "00:00am", "9:60am", "09:00PM", "09:00 pm", // 非法
}
for _, tc := range testCases {
fmt.Printf("%-10s → %t\n", tc, isValidHHMMa(tc))
}
}
输出:
09:00pm → true 09:00am → true 08:55pm → true 08:54am → true 1:00pm → true 12:00am → true 12:59pm → true 13:00am → false 00:00am → false 9:60am → false 09:00PM → false // 大写 PM 不匹配 09:00 pm → false // 含空格
⚠️ 注意事项与进阶建议
- 大小写敏感:上述正则仅匹配小写 am/pm。如需兼容 AM/PM 或混合大小写,改用 (?i)[ap]m(即 ^(0?[1-9]|1[012]):([0-5][0-9])(?i)[ap]m$);
- 空格容忍:原始需求不含空格,若需支持 09:00 pm,可改为 ^\s*(0?[1-9]|1[012]):([0-5][0-9])\s*[ap]m\s*$,但需权衡安全性(避免意外宽松);
- 语义验证增强:正则仅校验格式,不验证逻辑合理性(如 12:00am 是合法的,但 12:60am 已被分钟规则拦截)。若需进一步校验(如排除 12:00am 是否应写作 00:00),建议结合 time.Parse 解析后判断;
- 性能优化:高频调用时,将 regexp.MustCompile 提升为包级变量,避免重复编译;
- 替代方案:虽无轻量级专用 validator 包满足此特定格式,但可封装为可复用函数或集成到结构体标签校验(如配合 validator 库自定义 hhmma tag)。
综上,该正则简洁、准确、易维护,是验证 hh:mma 格式的首选方案。
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/jiquanzatan/124045.html