【问题标题】:Regex and Date pattern matching正则表达式和日期模式匹配
【发布时间】:2014-07-31 00:55:02
【问题描述】:

下面是我的正则表达式:

Pattern ddpat = Pattern.compile( "(\\d{1,2}/\\d{1,2}/\\d{4})" );

对于无效日期模式02/29/1975(因为它不是闰年),当我在这个无效日期尝试上述REGEX 时,我不希望我的正则表达式匹配这个无效日期。

请建议有什么方法可以实现这一点。

【问题讨论】:

  • 正则表达式无法做到这一点,您必须编写这些类型验证代码
  • 这个问题根本没有答案
  • 理论上 (!!!) 您可以创建一个正则表达式枚举 (!!!) 所有有效日期,并使用因子来减少重复(今天或将来某个时间停止)。这将是一个很大的正则表达式,但这将是一种“实现这一目标的方式”。 (这不是认真的。)
  • Regex 是这项工作的错误工具(检查日期的有效性)。问题不仅在于闰年,这个正则表达式也将接受:99/99/9999 ;)
  • 我同意这一点。但由于这是一个在生产环境中工作多年的现有代码,我无法以任何方式更改它,因此只是尝试做一些事情并让它现在就开始工作。

标签: java regex


【解决方案1】:

您必须使用DateFormatter 来验证日期。

不仅如此,您还必须将 DateFormat 的 setLenient 设置为 false 才能捕获此类错误

public static void main(String[] args) throws ParseException {
    String d = "02/29/1975";
    DateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
    sdf.setLenient(false);
    Date date = sdf.parse(d);
    System.out.println(date);
}

你会看到它抛出了ParseException

如果您不设置宽大处理,则 DateFormat 将尝试将其解析为方便的任意日期,例如:

02/29/1975 可以转换为03/01/1975

【讨论】:

  • 我有一个类似这样的日期格式数组:DateFormat[] format = new DateFormat[]{ new SimpleDateFormat("MM/dd/yyyy"), new SimpleDateFormat("dd/MM/ yy") };在这种情况下,如何使用 setLenient ?
  • @WhoAmI 循环遍历您的格式数组和 setLenient(false);在你使用它之前
  • 而不是循环,有什么快捷方式可以让我在声明数组时设置它?我只想优化代码。请提出建议。
  • @WhoAmI 说真的,是一个三行代码(如果你分开大括号)for(DateFormat f : format) { f.setLenient(false);}
猜你喜欢
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
相关资源
最近更新 更多