【问题标题】:Conversion of SimpleDateFormat patterns to Java regular expressions将 SimpleDateFormat 模式转换为 Java 正则表达式
【发布时间】:2016-08-20 03:10:20
【问题描述】:

是否有任何工具或库或建议的方法可以将SimpleDateFormat 类定义的日期模式字符串(例如“dd-mm-yyyy”)一般转换为Java 正则表达式?

网络中有许多示例(一些在 Stack Overflow 中)“手动”从特定日期模式派生正则表达式,但显然不存在任何自动化方法的实现(即编写进行转换的解析器)。

SimpleDateFormat 类有一个 compile() 方法,可以将字符串日期模式转换为字符数组而不是正则表达式,可能是因为它早于 Java 发行版中 java.util.regex 包的引入。

【问题讨论】:

    标签: java regex simpledateformat


    【解决方案1】:

    没有自动转换的原因是因为转换只是将ds ms 和ys 替换为\d。对于月份和日期名称,是的,正则表达式可能更有用,但它并不真正适合该特定任务;你会有一个群组,例如(Jan|Feb|...|Dec)。正则表达式非常适合发现模式,但不擅长验证这些模式中的数据。

    如果您真的不喜欢使用正则表达式,例如,您可以在字符串中查找dd 并将其替换为(?:[0-2]\d|3[01]);该正则表达式组不保证指定月份允许 31 天。

    【讨论】:

    • 这一切都非常合理(并且+1),但是如果你想评估一个随机字符串是否是一个日期呢?那么你肯定需要一个正则表达式。
    • 那么你需要一整套正则表达式,或者一个非常非常混乱的正则表达式; 16 May 20142014/05/1605-16-2014May 16, 2014 都是表达今天日期的有效方式(尽管甚至不是唯一的方式)。您也无法轻松验证日期(即:公元前 34 年 2 月 31 日)。
    • 没错!需要许多正则表达式,这就是为什么如果有一个工具可以从所有 SimpleDateFormat 模式中自动生成它们会容易得多。无需精确匹配即可从字符串中检测日期。
    • 如上所述,日期可以是任意数量的格式,有或没有标点符号、数字、单词、它们的组合,您必须使用机器语言环境等的通用格式。更好的方法是标记您的输入,然后按顺序查找特定模式,例如 1 个: 2 个值为 31 或更少的数字,3 个字母,然后在短时间内得到验证 + 最大天数,然后4 位数。正则表达式需要预期的输入,而您真的不知道这里可能会出现什么。
    • 是的,但是组合很多,如果有一种自动生成代码的方法会更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多