【发布时间】:2014-01-20 20:20:21
【问题描述】:
我正在读取包含@987654321@ 格式行的文件。如何使用regular expressions 来检查这些行的有效性?谢谢你。该应用程序是Java 应用程序。
【问题讨论】:
-
Regex 在这种情况下不是最佳选择。
我正在读取包含@987654321@ 格式行的文件。如何使用regular expressions 来检查这些行的有效性?谢谢你。该应用程序是Java 应用程序。
【问题讨论】:
使用正则表达式是不可能的。您将如何考虑闰年?您应该尝试解析日期。如果 parse 抛出异常,则日期错误:
SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");
f.setLenient(false); <-- by default SimpleDateFormat allows 20010132
try {
f.parse(str);
// good
} catch (ParseExcepton e) {
// bad
}
【讨论】:
您最好使用SimpleDateFormat 和setLenient(false); 来验证您的日期字符串
【讨论】:
就像 Jigar 建议的那样,最好使用DateFormat。
public static boolean isValidDate(String date) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.setLenient(false);
sdf.parse(date);
}
catch (Exception e) {
return false;
}
return true;
}
有帮助的link
【讨论】:
@EvgeniyDorofeev、@JigarJoshi 和@StinePike 的答案是正确的。但我建议对批量数据处理采用稍微不同的方法来避免基于昂贵 ParseException 的逻辑。
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.setLenient(false);
for (String line : lines) { // lines from your source
ParsePosition pos = new ParsePosition(0);
Date date = sdf.parse(line, pos);
boolean valid = (date != null);
// here you can continue with processing the single line
// can even evaluate the line number and error offset in line
}
只是关于正则表达式的一个评论:你想如何检查这样一个正则表达式中的公历日历规则?月份有不同的长度,有闰年等等。
【讨论】:
对于检查日期,正则表达式无效。但是,话虽如此,如果你真的想要一个正则表达式,请查看link
【讨论】: