Подтвердить дату в поле редактирования текста - PullRequest
1 голос
/ 14 октября 2011

Я использую следующий код для проверки даты, введенной в edittextbox.however в xml-файле, который я указал в качестве даты ввода.

int i = validate(registerdate);

это функция проверки:

private int  validate(String registerdate) {

        String regEx =
            "^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$";
          Matcher matcherObj = Pattern.compile(regEx).matcher(registerdate);
          if (matcherObj.matches())
            {
                return 1;
            }
            else
            {
                return 0;
            }
    }

это дает мне ошибку времени компиляции на

String regEx =
            "^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d$";

говоря недопустимые escape-последовательности.

Может ли кто-нибудь выяснить, в чем я не прав, или каким-либо другим способом проверить выражение даты?

Ответы [ 2 ]

2 голосов
/ 30 мая 2013

Надеюсь, это поможет:)

private Pattern pattern;
private Matcher matcher;

private static final String DATE_PATTERN = 
          "(0?[1-9]|1[012]) [/.-] (0?[1-9]|[12][0-9]|3[01]) [/.-] ((19|20)\\d\\d)";


  /**
   * Validate date format with regular expression
   * @param date date address for validation
   * @return true valid date format, false invalid date format
   */
   public boolean validate(final String date){

     matcher = pattern.matcher(date);

     if(matcher.matches()){
         matcher.reset();

         if(matcher.find()){
             String day = matcher.group(1);
             String month = matcher.group(2);
             int year = Integer.parseInt(matcher.group(3));

             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;
     }              
   }

и поместите эти коды на свой onClick ():

matcher = Pattern.compile(DATE_PATTERN).matcher(Birthday);

//Birthday validator
else if (!matcher.matches()) {
    Toast.makeText(getApplicationContext(), "Invalid Birthday!", Toast.LENGTH_SHORt).show();                    
}
2 голосов
/ 14 октября 2011

Java будет обрабатывать \ внутри строки как начало escape-последовательности .Убедитесь, что вы используете \ вместо (чтобы вы получили действительный \ символ в строке), и вы должны быть в порядке.

Quick Update: Как указывает Этьен, если вы действительно хотите \ в самом RegEx,вам нужно будет использовать \\, так как это приведет к \ в строке, что приведет к \ в RegEx.

Ваше регулярное выражение после исправления:

String regEx ="^(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\\d{2}$";
...