英国日期正则表达

时间:2011-02-04 09:53:53

标签: regex

我正在尝试创建一个验证英国日期格式的正则表达式。我有以下内容:

(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 ”。

7 个答案:

答案 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])

可以轻松修改为美国格式或其他欧盟格式。