我正在尝试创建一个验证英国日期格式的正则表达式。我有以下内容:
(0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d
这非常适合验证: 09 / 12/2011。但如果日期为: 9 / 12/2011,则无法正确验证。是否有正则表达式允许我使用单个数字和两个数字作为日期部分?例如“ 09 ”和“ 9 ”。
答案 0 :(得分:8)
只需将前导0
设为可选:
(0?[1-9]|[12][0-9]|3[01])[- /.](0?[1-9]|1[012])[- /.](19|20)\d\d
你需要一个额外的验证步骤 - 这个正则表达式当然不会检查无效日期,如31-02-2000
等。虽然可以在正则表达式中执行此操作,但不建议这样做,因为它更容易做到这个以编程方式,正则表达式将是可怕的。 Here is a date validating regex(使用mmddyyyy格式)来表示我的意思。
答案 1 :(得分:3)
我的偏好是简单正则表达式(\d{1,2})[-/.](\d{1,2})[-/.](\d{4})
的组合,以及一些验证这确实是正确日期的代码。你将不得不拥有那些代码,除非你想制作一个拒绝“29-02-2011”而不是“29-02-2008”的怪异正则表达式。
无论如何,这是一个正则表达式的细分,所以你可以看到发生了什么:
\d{1,2}
:此部分匹配一个或两个({1,2}
)个数字(\d
),构成日期的日期部分。[-/.]
:这与括号内的其中一个字符匹配,即.
,/
或-
。\d{1,2}
:再次,这与月份中的一位或两位数匹配。[-/.]
:另一个分隔符... \d{4}
:这与年份部分恰好匹配四位({4}
)数字。请注意,正则表达式的日,月和年部分位于括号内。这是为了创建组。这三个部分中的每一个都将被捕获到一个可以从匹配中检索的组中。从左到右,从1开始,用一个数字标识组。这意味着该日将是组1,月组2和年组3.还有一个组0始终包含匹配的整个文本。
您可以使用这些组执行验证的第二部分,并拒绝无效日期,例如“30-02-2011”,“31-4-2011”或“32-13-2011”。
如果要拒绝使用两个不同分隔符的输入,例如“31-12.2011”,您可以使用稍微更高级的功能,称为反向引用:
(\d{1,2})([-/.])(\d{1,2})\2(\d{4})
请注意,现在我将第一个分隔符放在一个组中。这会将月份更改为组3,将年份更改为组4.分隔符与组2匹配。后向引用是\2
部分在月份和年份之间。它匹配第二个前一组匹配的任何内容。如果从后向引用中返回两个组,则最终在组2中,即分隔符。如果该组与.
匹配,则反向引用仅匹配.
;如果它与-
匹配,则反向引用仅匹配-
;等等。
答案 2 :(得分:1)
什么是“英国日期格式”?
正式,今天是2011-02-21,见BS EN 28601 / ISO 8601.
在网络上,您应该都使用RFC 3339中定义的格式。
答案 3 :(得分:0)
是。 {n,m}
是量词,表示“至少n个元素,最多m个元素”。所以你可以写\d{1,2}
(匹配1或2位数)。完成日期:\d{1,2}/\d{1,2}/\d{4}
替代方案:使前导零可选:
0?\d/0?\d/\d{4}
问号表示,问号前面的元素是可选的。
答案 4 :(得分:0)
检查当天的正确方法是禁止[4-9].
号码。
像0[0-9]|[12][0-9]|3[01]|[^0-9][0-9]|^[0-9]
答案 5 :(得分:0)
使用此代码,我正在验证日期的所有内容。 : -
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class FinalDateValidator {
private Pattern pattern;
private Matcher matcher;
public boolean isValidDate(final String date) {
Pattern pattern;
Matcher matcher;
final String DATE_PATTERN = "([0-9]{4})/(0?[1-9]|1[012])/(0[1-9]|[12][0-9]|3[01]|[1-9])";
pattern = Pattern.compile(DATE_PATTERN);
matcher = pattern.matcher(date);
if (matcher.matches()) {
matcher.reset();
if (matcher.find()) {
int year = Integer.parseInt(matcher.group(1));
String month = matcher.group(2);
String day = matcher.group(3);
System.out.println("__________________________________________________");
System.out.println("year : "+year +" month : "+month +" day : "+day);
if (day.equals("31")
&& (month.equals("4") || month.equals("6")
|| month.equals("9") || month.equals("11")
|| month.equals("04") || month.equals("06") || month
.equals("09"))) {
return false; // only 1,3,5,7,8,10,12 has 31 days
} else if (month.equals("2") || month.equals("02")) {
// leap year
if (year % 4 == 0) {
if (day.equals("30") || day.equals("31")) {
return false;
} else {
return true;
}
} else {
if (day.equals("29") || day.equals("30")
|| day.equals("31")) {
return false;
} else {
return true;
}
}
} else {
return true;
}
} else {
return false;
}
} else {
return false;
}
}
public static void main(String argsp[]){
FinalDateValidator vs = new FinalDateValidator();
System.out.println("1: 1910/12/10---"+vs.isValidDate("1910/12/10"));
System.out.println("2: 2010/2/29---"+vs.isValidDate("2010/02/29"));
System.out.println("3: 2011/2/29---"+vs.isValidDate("2011/02/29"));
System.out.println("3: 2011/2/30---"+vs.isValidDate("2011/02/30"));
System.out.println("3: 2011/2/31---"+vs.isValidDate("2011/02/31"));
System.out.println("4: 2010/08/31---"+vs.isValidDate("2010/08/31"));
System.out.println("5: 2010/3/10---"+vs.isValidDate("2010/03/10"));
System.out.println("6: 2010/03/33---"+vs.isValidDate("2010/03/33"));
System.out.println("7: 2010/03/09---"+vs.isValidDate("2010/03/09"));
System.out.println("8: 2010/03/9---"+vs.isValidDate("2010/03/9"));
System.out.println("9: 1910/12/00---"+vs.isValidDate("1910/12/00"));
System.out.println("10: 2010/02/01---"+vs.isValidDate("2010/02/01"));
System.out.println("11: 2011/2/03---"+vs.isValidDate("2011/02/03"));
System.out.println("12: 2010/08/31---"+vs.isValidDate("2010/08/31"));
System.out.println("13: 2010/03/39---"+vs.isValidDate("2010/03/39"));
System.out.println("14: 201011/03/31---"+vs.isValidDate("201011/03/31"));
System.out.println("15: 2010/032/09---"+vs.isValidDate("2010/032/09"));
System.out.println("16: 2010/03/922---"+vs.isValidDate("2010/03/922"));
}
}
...享受
答案 6 :(得分:0)
我遇到了类似的要求。 这是完整的正则表达式以及闰年验证。 格式:dd / MM / yyyy
(3 [01] | [12] \ d | 0 [1-9])/(0 [13578] | 10 | 12)/((?0000)\ d {4})|(30 | [12] \ d | 0 [1-9])/(0 [469] | 11)/((?0000)\ d {4})|(2 [0-8] | [01] \ d | 0 [1-9])/(02)/((?0000)\ d {4})| 29 /(02)/(1600 | 2000 | 2400 | 2800 | 00)| 29 /(02)/(\ d \ d)(0 [48] | [2468] [048] | [13579] [26])
可以轻松修改为美国格式或其他欧盟格式。