如何使用JavaScript正则从多行字符串中提取HH:MM格式的时间
JavaScript 正则提取时间段解决方案
匹配失败原因
- 原正则使用了开头
^和结尾$锚点,要求匹配完整输入字符串,而你的需求是从长文本中提取子片段,两个锚点直接导致匹配返回false - 原正则仅支持匹配单个AM/PM格式的时间点,没有覆盖时间段连接符、第二部分时间、时区后缀的匹配规则
可用实现方案
匹配规则说明
针对你给出的示例格式(12小时制时间段 + 3位大写字母时区),使用如下正则即可完成提取:/(0?[1-9]|1[0-2]):[0-5]\d\s?[AP]\.?M\.?\s*-\s*(0?[1-9]|1[0-2]):[0-5]\d\s?[AP]\.?M\.?\s+[A-Z]{3}/i
规则拆解:
(0?[1-9]|1[0-2]):[0-5]\d:匹配12小时制的小时:分钟格式\s?[AP]\.?M\.?:匹配可选空格 + AM/PM(支持带点的A.M./P.M.格式,不区分大小写)\s*-\s*:匹配时间段连接符,前后支持任意数量空格\s+[A-Z]{3}:匹配空格 + 3位大写字母时区
代码示例
const inputStr = "Please provide access to the engineer: last name: XYZ first name: ABC date: 02nd November 2021 time window: 11:00AM - 07:00PM CET"; const timeRangeReg = /(0?[1-9]|1[0-2]):[0-5]\d\s?[AP]\.?M\.?\s*-\s*(0?[1-9]|1[0-2]):[0-5]\d\s?[AP]\.?M\.?\s+[A-Z]{3}/i; const matchResult = inputStr.match(timeRangeReg); if (matchResult) { // 提取到的时间段 console.log(matchResult[0]); // 输出:11:00AM - 07:00PM CET }
适配扩展调整
如果需要适配更多场景,可以按需修改正则规则:
- 支持4位时区缩写:将末尾
[A-Z]{3}改为[A-Z]{3,4} - 支持24小时制时间:将小时匹配规则
(0?[1-9]|1[0-2])改为([01]?[0-9]|2[0-3]) - 支持不带AM/PM的格式:删除对应匹配段即可
内容的提问来源于stack exchange,提问作者udayKrishnan
相关产品推荐
相关产品推荐

