如何用正则表达式将PT格式时间转换为分钟数?
PT格式时间字符串转分钟数的正则校验与转换方案
问题场景
输入的PT格式字符串示例:
PT45M PT1H PT30M PT PT2H
期望输出(统一转换为分钟数):
45 60 30 0 120
需求说明:
- 校验格式是否符合
PT<数字><H|M>,或仅为PT - 符合格式时:
- 末尾为
M则直接取数字作为分钟数 - 末尾为
H则将数字乘以60转为分钟数 - 仅
PT时返回0分钟
- 末尾为
- 格式不符合时返回0
解决方案思路
别指望单独用正则搞定所有事——正则只能帮你校验格式、提取数字和单位,乘以60这种算术活得交给代码逻辑来做。下面是具体步骤:
1. 正则匹配规则
用这个正则就能覆盖所有合法格式,还能把数字和单位单独提出来:
^PT(?:(\d+)([HM]))?$
拆解一下:
^PT:必须以PT开头(?:(\d+)([HM]))?:这部分是可选的(对应仅PT的情况),里面的两个捕获组分别抓数字和单位(\d+):抓时间对应的数字(比如PT45M里的45)([HM]):抓时间单位(H或者M)
$:必须到字符串结尾,避免出现PT1Habc这种无效格式
2. 配合代码完成转换
给你两个常用语言的实现例子:
Python版本
import re def pt_to_minutes(pt_str): # 用正则匹配整个字符串 match_result = re.fullmatch(r'^PT(?:(\d+)([HM]))?$', pt_str) # 匹配失败直接返回0 if not match_result: return 0 num_str, unit = match_result.groups() # 只有PT的情况,返回0 if not num_str: return 0 # 转成整数,根据单位计算分钟数 num = int(num_str) return num * 60 if unit == 'H' else num # 测试一下示例 test_list = ["PT45M", "PT1H", "PT30M", "PT", "PT2H", "随便输个无效的"] for item in test_list: print(pt_to_minutes(item))
运行后输出:
45 60 30 0 120 0
JavaScript版本
function ptToMinutes(ptStr) { const match = ptStr.match(/^PT(?:(\d+)([HM]))?$/); if (!match) return 0; const [, numStr, unit] = match; if (!numStr) return 0; const num = parseInt(numStr, 10); return unit === 'H' ? num * 60 : num; } // 测试用例 const testCases = ["PT45M", "PT1H", "PT30M", "PT", "PT2H", "invalid"]; testCases.forEach(item => console.log(ptToMinutes(item)));
关键说明
正则本身是用来匹配文本模式的,没有计算能力,没法直接把小时转成分钟。所以最佳路径就是正则抓数据,代码做计算,既简洁又靠谱。
内容的提问来源于stack exchange,提问作者Kate
相关产品推荐
相关产品推荐

