Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
Java中利用正则表达式和java.time API验证时间区间字符串格式_创想鸟

Java中利用正则表达式和java.time API验证时间区间字符串格式

Java中利用正则表达式和java.time API验证时间区间字符串格式

本文详细介绍了在java中如何高效地验证包含多个时间区间的字符串格式。首先,利用正则表达式对字符串进行初步的结构性校验,确保其符合预期的模式。随后,结合java.time.localtime api对每个时间点进行精确解析,并进一步验证时间区间的逻辑正确性,例如起始时间早于结束时间。

在Java开发中,经常会遇到需要验证特定格式字符串的场景。例如,一个字符串可能包含由逗号分隔的多个时间区间,每个区间由一个起始时间和结束时间组成,格式为HH:MM-HH:MM。本文将深入探讨如何结合正则表达式和Java 8引入的java.time API,对这类复杂的时间区间字符串进行全面且健壮的格式验证。

1. 初步结构性验证:正则表达式

首先,我们需要对整个字符串进行初步的结构性校验。这可以通过正则表达式来完成,以确保字符串符合HH:MM-HH:MM,HH:MM-HH:MM,…的基本模式。

1.1 错误的尝试与分析

一些开发者可能会尝试使用类似 ^[0-9:0-9-0-9:0-9,]+$ 的正则表达式。然而,这种模式过于宽泛,它会匹配任何包含数字、冒号、连字符和逗号的组合,而无法保证HH:MM的精确结构,也无法防止逗号出现在字符串末尾等无效情况。

1.2 正确的正则表达式

一个更精确的正则表达式是:^(?:(?:d{2}:d{2}-d{2}:d{2})(?:,(?!$))?)*$。我们来解析这个正则表达式的各个部分:

^:匹配字符串的开始。$:匹配字符串的结束。d{2}:匹配任意两位数字(00-99),用于表示小时和分钟。::匹配冒号分隔符。-:匹配连字符分隔符(需要转义)。d{2}:d{2}-d{2}:d{2}:这部分匹配一个完整的时间区间,例如 09:00-10:00。(?:…):这是一个非捕获组,用于将多个模式组合在一起而不创建额外的捕获组。(?:,(?!$))?:这部分匹配一个逗号,但有一个重要的负向前瞻断言 (?!$)。它确保逗号后面不能是字符串的结尾,从而避免了像 09:00-10:00, 这样的无效字符串。*:表示前面的整个模式(一个时间区间加上可选的逗号)可以重复零次或多次。

在Java中,当使用 String#matches(String regex) 方法时,它会自动在内部将正则表达式包裹在 ^ 和 $ 中,所以通常我们不需要显式地添加它们。

立即学习“Java免费学习笔记(深入)”;

import java.util.regex.Pattern;public class RegexValidation {    public static boolean isValidTimeIntervalStringFormat(String strTimeRanges) {        // 正则表达式用于验证整体结构        // String#matches 方法会自动处理 ^ 和 $        String regex = "(?:(?:d{2}:d{2}-d{2}:d{2})(?:,(?!$))?)*";        return strTimeRanges.matches(regex);    }    public static void main(String[] args) {        System.out.println("09:00-10:00,12:00-14:30,16:00-18:00 -> " + isValidTimeIntervalStringFormat("09:00-10:00,12:00-14:30,16:00-18:00")); // true        System.out.println("09:00-10:00 -> " + isValidTimeIntervalStringFormat("09:00-10:00")); // true        System.out.println("09:00 10:00 -> " + isValidTimeIntervalStringFormat("09:00 10:00")); // false (空格)        System.out.println("09:00-10:00, -> " + isValidTimeIntervalStringFormat("09:00-10:00,")); // false (末尾逗号)        System.out.println("99:99-99:99 -> " + isValidTimeIntervalStringFormat("99:99-99:99")); // true (结构正确,但时间无效)    }}

请注意,虽然 99:99-99:99 通过了上述正则表达式的验证,因为它在结构上是正确的,但它并非一个有效的时间。这就引出了下一步的验证。

2. 深入时间语义验证:使用 java.time.LocalTime

正则表达式只能验证字符串的语法结构,无法判断其语义上的有效性。例如,99:99 结构上是 HH:MM,但并非一个实际存在的时间;10:00-09:00 结构正确,但逻辑上起始时间晚于结束时间。为了解决这些问题,我们需要借助 java.time.LocalTime API。

疯狂翻译师App 疯狂翻译师App

支持屏幕、图片、视频字幕、文档、漫画等多种翻译,准确率高,操作简单。

疯狂翻译师App 104 查看详情 疯狂翻译师App

2.1 验证单个时间点的有效性

java.time.LocalTime 提供了一个强大的 parse() 方法,可以根据ISO 8601标准(默认支持HH:MM和HH:MM:SS等格式)将字符串解析为时间对象。如果字符串无法解析为有效时间,它会抛出 DateTimeParseException。

我们可以将通过正则表达式初筛的字符串,按逗号和连字符进行分割,然后逐一解析每个时间点。

import java.time.LocalTime;import java.time.format.DateTimeParseException;public class TimeParserValidation {    public static boolean hasCorrectFormat(String strTimeRanges) {        // 1. 初步正则表达式验证        if (!strTimeRanges.matches("(?:(?:d{2}:d{2}-d{2}:d{2})(?:,(?!$))?)*")) {            return false;        }        // 2. 分割并验证每个时间点的有效性        // 注意:这里将所有时间点(起始和结束)都提取出来进行验证        String[] times = strTimeRanges.split("[-,]"); // 按逗号或连字符分割        for (String time : times) {            try {                LocalTime.parse(time); // 尝试解析时间            } catch (DateTimeParseException e) {                return false; // 解析失败,说明时间格式不正确或值无效            }        }        return true; // 所有时间点都有效    }    public static void main(String[] args) {        System.out.println("09:00-10:00,12:00-14:30,16:00-18:00 -> " + hasCorrectFormat("09:00-10:00,12:00-14:30,16:00-18:00")); // true        System.out.println("09:00-10:00,12:00-1:30,16:00-18:00 -> " + hasCorrectFormat("09:00-10:00,12:00-1:30,16:00-18:00")); // false (1:30 非 HH:MM)        System.out.println("09:00-10:00,99:99-18:00 -> " + hasCorrectFormat("09:00-10:00,99:99-18:00")); // false (99:99 非有效时间)        System.out.println("09:00-10:00 -> " + hasCorrectFormat("09:00-10:00")); // true    }}

2.2 验证时间区间的逻辑顺序

除了验证单个时间点的有效性,我们通常还需要确保每个时间区间内,起始时间早于或等于结束时间。

import java.time.LocalTime;import java.time.format.DateTimeParseException;public class FullTimeRangeValidation {    public static boolean hasCorrectFormatAndRanges(String strTimeRanges) {        // 1. 初步正则表达式验证        if (!strTimeRanges.matches("(?:(?:d{2}:d{2}-d{2}:d{2})(?:,(?!$))?)*")) {            return false;        }        // 2. 分割时间区间并验证其内部逻辑        String[] timeRanges = strTimeRanges.split(","); // 按逗号分割,获取每个时间区间字符串        for (String timeRange : timeRanges) {            String[] times = timeRange.split("-"); // 按连字符分割,获取起始时间和结束时间            try {                LocalTime startTime = LocalTime.parse(times[0]);                LocalTime endTime = LocalTime.parse(times[1]);                // 验证结束时间是否在起始时间之后                if (endTime.isBefore(startTime)) {                    return false; // 结束时间早于起始时间,逻辑错误                }            } catch (DateTimeParseException e) {                // 如果在这一步才捕获到DateTimeParseException,说明前面的正则表达式不够严谨                // 但作为二次校验,捕获并返回false也是一种安全措施                return false;            }        }        return true; // 所有验证通过    }    public static void main(String[] args) {        System.out.println("09:00-10:00,12:00-14:30,16:00-18:00 -> " + hasCorrectFormatAndRanges("09:00-10:00,12:00-14:30,16:00-18:00")); // true        System.out.println("09:00-10:00,12:00-1:30,16:00-18:00 -> " + hasCorrectFormatAndRanges("09:00-10:00,12:00-1:30,16:00-18:00")); // false (1:30 非 HH:MM)        System.out.println("10:00-09:00,12:00-14:30,16:00-18:00 -> " + hasCorrectFormatAndRanges("10:00-09:00,12:00-14:30,16:00-18:00")); // false (10:00-09:00 逻辑错误)        System.out.println("09:00-09:00 -> " + hasCorrectFormatAndRanges("09:00-09:00")); // true (开始等于结束是允许的)    }}

3. 完整示例与注意事项

将上述两种验证方式结合起来,可以创建一个全面且健壮的验证方法。

import java.time.LocalTime;import java.time.format.DateTimeParseException;public class TimeIntervalValidator {    /**     * 验证时间区间字符串是否符合正确的格式和逻辑。     * 字符串格式示例: "09:00-10:00,12:00-14:30,16:00-18:00"     *     * @param strTimeRanges 待验证的时间区间字符串     * @return 如果格式和逻辑都正确,则返回 true;否则返回 false。     */    public static boolean validateTimeIntervalString(String strTimeRanges) {        // 1. 使用正则表达式进行初步的结构性验证        // 确保字符串符合 HH:MM-HH:MM 的模式,且逗号不出现在末尾        String regex = "(?:(?:d{2}:d{2}-d{2}:d{2})(?:,(?!$))?)*";        if (!strTimeRanges.matches(regex)) {            return false;        }        // 如果字符串为空,则认为格式正确(没有时间区间)        if (strTimeRanges.isEmpty()) {            return true;        }        // 2. 分割时间区间,并使用 java.time.LocalTime 进行语义和逻辑验证        String[] timeRanges = strTimeRanges.split(",");        for (String timeRange : timeRanges) {            String[] times = timeRange.split("-");            // 每个区间必须包含两个时间点(起始和结束)            if (times.length != 2) {                return false;            }            try {                LocalTime startTime = LocalTime.parse(times[0]);                LocalTime endTime = LocalTime.parse(times[1]);                // 验证时间区间的逻辑:结束时间必须在起始时间之后或等于起始时间                if (endTime.isBefore(startTime)) {                    return false;                }            } catch (DateTimeParseException e) {                // 如果LocalTime.parse失败,说明时间字符串本身无效(如"25:00"或"09:99")                return false;            }        }        return true; // 所有验证通过    }    public static void main(String[] args) {        // 测试用例        System.out.println("--- 验证结果 ---");        System.out.println("09:00-10:00,12:00-14:30,16:00-18:00 -> " + validateTimeIntervalString("09:00-10:00,12:00-14:30,16:00-18:00")); // true        System.out.println("09:00-10:00 -> " + validateTimeIntervalString("09:00-10:00")); // true        System.out.println(" -> " + validateTimeIntervalString("")); // true (空字符串,无时间区间)        System.out.println("09:00 10:00 -> " + validateTimeIntervalString("09:00 10:00")); // false (空格,不符合正则)        System.out.println("09:00-10:00, -> " + validateTimeIntervalString("09:00-10:00,")); // false (末尾逗号,不符合正则)        System.out.println("09:00-10:00,12:00-1:30,16:00-18:00 -> " + validateTimeIntervalString("09:00-10:00,12:00-1:30,16:00-18:00")); // false (1:30 非 HH:MM,LocalTime解析失败)        System.out.println("10:00-09:00,12:00-14:30,16:00-18:00 -> " + validateTimeIntervalString("10:00-09:00,12:00-14:30,16:00-18:00")); // false (10:00-09:00 逻辑错误)        System.out.println("09:00-10:00-12:00-14:30,16:00-18:00 -> " + validateTimeIntervalString("09:00-10:00-12:00-14:30,16:00-18:00")); // false (连字符过多,不符合正则)        System.out.println("25:00-26:00 -> " + validateTimeIntervalString("25:00-26:00")); // false (LocalTime解析失败)        System.out.println("09:60-10:00 -> " + validateTimeIntervalString("09:60-10:00")); // false (LocalTime解析失败)    }}

注意事项

分阶段验证: 采用正则表达式进行初步的结构性验证,再使用 java.time API进行详细的语义和逻辑验证,这种分阶段的方法既高效又健壮。正则表达式可以快速排除大量不符合基本结构的字符串,避免不必要的 LocalTime 解析开销。String#matches() 的特性: String#matches(String regex) 方法在内部会隐式地将正则表达式锚定到字符串的开头和结尾(即自动添加 ^ 和 $),因此在编写 regex 参数时通常不需要手动添加它们。异常处理: LocalTime.parse() 方法在遇到无法解析的字符串时会抛出 DateTimeParseException。正确捕获和处理此异常是确保程序健壮性的关键。扩展性: 如果需要处理更复杂的场景,例如检查时间区间是否重叠、是否在特定日期范围内、是否跨越午夜等,可以在 LocalTime 对象上进行进一步的逻辑判断。例如,判断重叠需要将所有区间解析为 LocalTime 对,然后进行排序和比较。

总结

通过结合正则表达式对时间区间字符串进行初步的结构性校验,以及利用 java.time.LocalTime API对每个时间点进行精确解析和逻辑顺序验证,我们可以构建一个强大而灵活的验证机制。这种两阶段的验证方法不仅提高了验证的准确性,也使得代码更易于理解和维护,是处理复杂时间字符串验证的推荐实践。

以上就是Java中利用正则表达式和java.time API验证时间区间字符串格式的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/726350.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
vivo X110充电慢怎么办 vivo X110快充优化
上一篇 2025年11月24日 17:50:00
奇瑞9月出口汽车13.8万辆 成为中国车企单月出海冠军!
下一篇 2025年11月24日 17:50:01

相关推荐

  • X旗下Grok上线即时语音搜索,挑战Google引领搜索新方向

    近日,x平台旗下的ai助手grok正式推出了“即时语音搜索”功能。用户现在可以通过语音直接提问,触发实时网页检索,并迅速获得整合后的精准答案。此举意在优化信息获取流程,推动人机交互向更自然、高效的方向演进。 该语音搜索模式实现了“即说即搜即答”的流畅体验。例如,当用户提出“星舰发射的具体时间是什么?…

    2026年9月21日
    100
  • Laravel应用的安全审计(Security Audit)方法

    进行安全审计对laravel应用至关重要,因为它能发现并修复安全漏洞,提升整体安全性和用户信任度。具体方法包括:1. 代码审查,确保无未过滤输入和弱密码;2. 配置文件安全性,保护敏感信息;3. 依赖管理,更新第三方包;4. 用户认证和授权,防止未授权访问;5. 日志和监控,检测异常行为。 在讨论L…

    2026年9月21日
    100
  • Laravel 8 登录后重定向到仪表盘的全面指南

    本文深入探讨了 Laravel 8 中用户登录后重定向到仪表盘的多种策略。我们将详细解析默认的重定向机制,包括 LoginController 和 RedirectIfAuthenticated 中间件,并重点介绍如何通过自定义登录逻辑实现精确的重定向控制,同时提供示例代码和常见问题排查建议,确保用…

    2026年9月21日
    000
  • Guava Multimap:高效获取并打印指定键的所有关联值

    guava multimap是处理一键多值映射关系的强大工具。要获取特定键的所有关联值,应直接使用其提供的`multimap#get(k)`方法。该方法会返回一个包含所有匹配值的`collection`,即使键不存在,也会返回一个空集合而非`null`,从而简化了值检索和空值处理逻辑,是比手动迭代键…

    2026年9月21日
    000
  • 控制台命令(Console Command)开发

    控制台命令是程序员日常工作中不可或缺的工具,它提高了开发效率并帮助理解和控制程序运行。1) 通过简单的文本输入,完成复杂任务,如文件管理和系统监控。2) 控制台命令可用于快速调试、测试代码和自动化重复工作。3) 开发控制台命令时需注意安全性和兼容性问题。4) 控制台命令可实现有趣功能,如监控服务器资…

    2026年9月21日
    100
  • 链路追踪(OpenTelemetry/Jaeger)集成

    要将opentelemetry和jaeger集成到java应用中,需按以下步骤操作:1.配置jaeger exporter,2.初始化opentelemetry,3.创建并管理span。通过这种方式,你可以有效地追踪和分析微服务间的调用链路,提升系统性能。 在现代微服务架构中,链路追踪已经成为诊断和…

    2026年9月21日
    000
  • Maingear电脑黑屏问题如何修复?专业级主机BIOS设置方法详尽

    Maingear电脑黑屏问题通常由BIOS设置、硬件接触不良或显示输出配置引起。首先应尝试进入BIOS,检查并调整显卡输出模式为PCIe/PEG,确保未误设为集成显卡;排查PCIe插槽模式兼容性,必要时切换为Gen3或Auto;若启动异常,可尝试切换UEFI/Legacy模式或恢复BIOS默认设置(…

    2026年9月21日
    000
  • 实测!Sora 2长视频优势大,Vidu Q2细节处理更胜一筹

    近日,AI视频工具领域的竞争愈发激烈。OpenAI推出的Sora 2刚刚登顶美区App Store榜单,国产新秀Vidu Q2便携重磅升级版本强势入局,引发广泛关注。不少从事自媒体创作与影视剪辑的朋友都在思考:这两款AI视频生成器,究竟谁更胜一筹?出于好奇,我亲自上手实测了一番,发现两者之间的差异更…

    用户投稿 2026年9月21日
    000
  • Java Stream 高效分组计数并获取Top N元素

    本文深入探讨了如何利用java stream api对数据进行高效的分组计数,并从中提取出现频率最高的top n元素。文章首先介绍了一种简洁的基于全排序的实现方式,该方法适用于数据集较小或top n值接近总数的情况。随后,针对大数据量和小型top n场景下的性能瓶颈,文章详细阐述了如何通过自定义`c…

    2026年9月21日
    000
  • mysql安装后如何优化配置文件

    答案:优化MySQL配置需先定位配置文件,再根据硬件和业务调整内存、InnoDB、连接等核心参数。具体包括设置innodb_buffer_pool_size为物理内存50%~70%,合理配置日志参数与连接数,启用慢查询日志,并使用工具辅助调优,避免过度配置,确保稳定高效。 MySQL 安装后,优化配…

    2026年9月21日
    000
  • mac怎么阻止特定app访问网络_Mac阻止应用访问网络方法

    可通过系统防火墙、hosts文件、第三方工具或pf防火墙阻止应用联网。首先,macOS内置防火墙可阻断入站连接,需在“系统设置-网络-防火墙”中添加应用并启用阻止;其次,编辑/etc/hosts文件,将目标域名指向127.0.0.1可屏蔽其网络访问,需刷新DNS缓存生效;再者,使用Little Sn…

    2026年9月21日
    000
  • VSCode的括号匹配功能如何自定义?

    可通过 settings.json 自定义括号高亮的边框和背景色;2. 用 editor.matchBrackets 控制是否启用高亮;3. 启用 bracketPairColorization 可为嵌套括号着色;4. 使用 Ctrl/Cmd + Shift + 快速跳转配对括号。 VSCode 的…

    2026年9月21日
    000
  • 马斯克xAI的Grok将推AI视频检测工具,能否破解深度伪造难题?

    随着ai视频生成技术飞速渗透网络,深度伪造内容不断扩散,网络信息真实性面临前所未有的挑战。在此背景下,马斯克的xai公司的grok模型即将推出一项关键升级,打造一款“真伪侦探”工具。 近日,马斯克在X平台回应网友担忧时表示,Grok即将获得识别AI生成视频并追踪其网络来源的能力,以此应对深度伪造内容…

    2026年9月21日
    000
  • JSF应用中Markdown文档动态链接处理指南

    本教程旨在解决jsf web应用程序中集成markdown文档时,如何动态处理内部链接以实现页面局部更新的问题。通过结合服务器端markdown渲染和客户端javascript事件监听,我们可以拦截markdown生成的html链接点击事件,利用ajax异步加载并渲染目标markdown文件,从而在…

    2026年9月21日
    500
  • AI推文助手如何生成节日祝福 AI推文助手的情感连接内容创作

    AI推文助手如何生成节日祝福 AI推文助手的情感连接内容创作AI推文助手如何生成节日祝福 AI推文助手的情感连接内容创作AI推文助手如何生成节日祝福 AI推文助手的情感连接内容创作AI推文助手如何生成节日祝福 AI推文助手的情感连接内容创作

    答案:通过AI推文助手的节日模板、情感关键词、用户数据定制和多语言混合策略,可高效生成个性化祝福,增强受众情感连接。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 如果您希望借助AI推文助手在节日期间传递温暖的祝福,同时增强与受众的情感连接…

    2026年9月21日 • 用户投稿
    000
  • 如何通过命令行参数启动VSCode?

    掌握VSCode命令行用法可提升开发效率,需先安装code命令到PATH,之后可用code .打开目录、code 文件名打开文件、code –diff比较文件、–disable-extensions排查问题,并支持别名与Shell结合使用。 通过命令行启动 VSCode 是一…

    2026年9月21日
    100
  • 在Java中如何实现线程优先级控制

    Java中线程优先级通过Thread类实现,取值范围1-10,分别对应MIN_PRIORITY、NORM_PRIORITY和MAX_PRIORITY;新线程继承父线程优先级,可通过setPriority()设置;尽管高优先级线程更可能被调度,但执行顺序不保证,因受操作系统影响;应避免依赖优先级控制关…

    2026年9月21日
    000
  • 如何在Java中使用接口实现多继承效果

    Java不支持多继承,但可通过实现多个接口模拟该效果。类可同时实现Flyable、Swimmable等接口,具备多种行为能力,并能利用默认方法复用逻辑,如Loggable提供日志功能。当多个接口含同名默认方法时,需在类中显式重写以解决冲突。接口用于定义“能做什么”,抽象类描述“是什么”,因类只能单继…

    2026年9月21日
    100
  • 万人同时在线抽奖活动架构

    万人同时在线抽奖活动的系统架构应采用微服务架构、分布式数据库、redis缓存、区块链存储结果,并使用负载均衡和异步处理技术。具体包括:1.采用微服务架构和分布式数据库(如tidb)保证系统稳定性和可扩展性;2.使用redis处理抽奖逻辑,确保高效和随机性;3.将结果存入区块链,保证透明度和可验证性;…

    2026年9月21日
    000
  • 小可AI小程序入口链接_小可AI小程序官方地址

    小可AI小程序官方入口为https://xcx.xiaokeai.com.cn,用户可在社交平台搜索使用;平台支持多轮对话、文本生成、图像理解及语音转文字功能,界面简洁、响应迅速,具备历史记录查看与持续优化的智能算法。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepS…

    2026年9月21日
    000

发表回复

登录后才能评论
关注微信