var dateObj = {
  '01/01/2017' : true,
  '1/1/2016' : true,
  '1/1/16' : true,
  '1/1/116' : false,
  '01/11/2016' : true,
  '01.01.2016' : true,
  '01.01_2016' : false,
  '01-0-2016' : false,
  '01-01-2016' : true
};
var failedAttempts = [];
var date_val = "01/01/2017";
var re = /^(\d{1,2})[/.\-](\d{1,2})[/.\-](\d{4}|\d{2})$/;
for(let i in dateObj){
  let result = re.test(i);
  if(result != dateObj[i]){
    failedAttempts.push(i);
  }
}
if(failedAttempts.length > 0){
  console.error('Unit test fails');
  console.log(failedAttempts);
}else{
  console.log('Unit test pass');
}

'01-0-2016' : false considera que este caso devuelve verdadero incluso si está en formato incorrecto. Quiero reescribir Regex con el dígito que coincida con 1 o 2 pero no 0 en single dígito.

2
Anwar Hussain 16 feb. 2017 a las 10:45

4 respuestas

La mejor respuesta

Restrinja los patrones de coincidencia de dígitos con lookaheads negativos (?!0+\b):

 /^(?!0+\b)(\d{1,2})[\/.-](?!0+\b)(\d{1,2})[\/.-](\d{4}|\d{2})$/
   ^^^^^^^^               ^^^^^^^^ 

Consulte la demostración de expresiones regulares

Si no necesita restringir ambas partes del día al mes, simplemente elimine la búsqueda anticipada innecesaria.

El patrón (?!0+\b) coincide con uno o más ceros seguidos de un límite de palabra (es decir, no puede haber ninguna letra / dígito / _ después), y si se encuentra el patrón, la coincidencia falla.

2
Wiktor Stribiżew 16 feb. 2017 a las 07:49

Esto debería funcionar para usted:

const validateDate = (date) => /^(?:[1-2]\d|0?[1-9]|30|31)([.\/-])(?:0?[1-9]|1[0-2])\1(?:\d{4}|\d{2})$/.test(date)

const testData = [`01/01/2017`, `1/1/2016`, `1/1/16`, `01/11/2016`, `01.01.2016`, `01-01-2016`, `01.0.2016`, `01.01_2016`, `01-0-2016`, `1/1/116`, `41.23.23`]

for (const date of testData){
  console.log(`${date} ${validateDate(date)}`)
}
0
Maciej Kozieja 16 feb. 2017 a las 08:56

Aquí hay una forma no regex de validar sus cadenas de fecha de entrada utilizando los formatos dd/mm/yyyy o /dd/mm/yy:

for(let str in dateObj) {
   var parts = str.split(/[-.\/]/);
   var p = parts[0]*parts[1]*parts[2];
   if (isNaN(p) || p<10 || (p>99 && p<1000)) {
      console.log("Invalid date: ", str);
   }
}

Salida:

Invalid date:  1/1/116
Invalid date:  01.01_2016
Invalid date:  01-0-2016
  1. Primero estamos dividiendo la cadena de fecha en 3 partes usando delimitadores - o . o /
  2. Luego estamos multiplicando las 3 partes y tomando el producto para su validación
  3. Finalmente, estamos utilizando las condiciones isNaN(p) || p<10 || (p>99 && p<1000 para la validación. isNan abordará todas las entradas de fecha inválidas, p<=0 abordará el día, mes o año siendo cero y la última condición abordará la parte del año en 3 dígitos.
0
anubhava 16 feb. 2017 a las 08:21

Podría haber varias formas, propongo:

var re = /^(\d{1,2})[/.\-]([1-9]|[0-9]{2})[/.\-](\d{4}|\d{2})$/;

Avísame si resuelve tu problema.

0
JS G. 16 feb. 2017 a las 07:56