Что не так с этим кодом проверки JQuery? RegExp.exec (значение) - PullRequest
1 голос
/ 19 августа 2009

Значение будет любым, а совпадения равны нулю. Смысл этого состоит в том, чтобы разбить строку, например "1991-12-01", и убедиться, что все части строки являются действительными датами.

dateISO: function(value, element) {
    if (this.optional(element)) return true;
    var regexp = new RegExp('^\d{4}[\/-](\d{1,2})[\/-](\d{1,2})$');
    var matches = regexp.exec(value);
    alert(matches);

Есть идеи?

Ответы [ 2 ]

7 голосов
/ 19 августа 2009

Выражение, которое вы даете, является строкой, поэтому необходимо экранировать:

var regexp = new RegExp('^\\d{4}[\\/-](\\d{1,2})[\\/-](\\d{1,2})$');

Кроме того, вы можете использовать выражения в стиле perl, но косые черты необходимо экранировать:

var regexp = /^\d{4}[\\/-](\d{1,2})[\\/-](\d{1,2})$/;

(регулярное выражение в стиле perl возвращает объект RegExp)

4 голосов
/ 19 августа 2009

Почему бы просто не пропустить здесь регулярное выражение? Я знаю, что это способ больше кода, но он выдаст ошибки для дат, которые регулярные выражения не могут, например, дата, указывающая 31 ноября.

var datesToTest = [
    "1991-12-01"  // valid
  , "1991-11-31"  // invalid, Nov has 30 days
  , "1991-13-01"  // invalid, no 13th month
];

// Note: console.log() requires Firebug - switch to alert() if you wish
for ( var i = 0; i < datesToTest.length; i++ )
{
  if ( !isValidDate( datesToTest[i], '-' ) )
  {
    console.log( datesToTest[i] + ' is not a valid date!' );
  } else {
    console.log( datesToTest[i] + ' is valid date!' );
  }
}

function isValidDate( dateAsString, delimiter )
{
  var dateObject = new Date( dateAsString.replace( new RegExp( delimiter, 'g' ), '/' ) );
  var checkDate = [
      dateObject.getFullYear()
    , zeroFill( dateObject.getMonth() + 1, 2 )
    , zeroFill( dateObject.getDate(), 2 )
  ].join( delimiter );
  return ( dateAsString == checkDate );
}

function zeroFill( number, width )
{
  width -= number.toString().length;
  if ( width > 0 )
  {
    return new Array( width + (/\./.test( number ) ? 2 : 1) ).join( '0' ) + number;
  }
  return number;
} 

Это будет работать до тех пор, пока вам не нужно проверять дату до 100 г. н.э. = P

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...