2010-09-30 9 views
12
var dateRegex = /\/Date\((\d+)\)\//g; // [0-9] instead of \d does not help. 
dateRegex.test("/Date(1286443710000)/"); // true 
dateRegex.test("/Date(1286445750000)/"); // false 

Las consolas JavaScript de Chrome y Firefox confirman. ¿Qué demonios, muchachos?¿Qué pasa con mi fecha regex?

Editar: aún más simple caso de prueba:

var dateRegex = /Date\(([0-9]+)\)/g; 
dateRegex.test("Date(1286445750000)"); // true 
dateRegex.test("Date(1286445750000)"); // false 
dateRegex.test("Date(1286445750000)"); // true 
dateRegex.test("Date(1286445750000)"); // false 
dateRegex.test("Date(1286445750000)"); // true 

Esto demuestra que se alterna verdadero/falso cada vez ...

Respuesta

21

En su caso eliminar el modificador g desde el extremo, por ejemplo:

var dateRegex = /\/Date\((\d+)\)\//; 
dateRegex.test("Date(1286445750000)"); // true 
dateRegex.test("Date(1286445750000)"); // true 
dateRegex.test("Date(1286445750000)"); // true 
dateRegex.test("Date(1286445750000)"); // true 
dateRegex.test("Date(1286445750000)"); // true 

Es un error con la forma en que se implementan las expresiones regulares en ECMAScript 3, there's a great post on the details here.

+1

¿Un comportamiento incorrecto del navegador que no es culpa de Microsoft? ¿Lo que da? =) – RMorrisey

+1

Todavía no hay planes para agregar soporte de lookbehind, ¿eh? – NullUserException

+0

@NullUserException - No me mantengo al día con esta parte de la especificación realmente, algunos de los chicos de regex podrían ... pero ese artículo tiene algunos años, aunque es el mismo error que los OPs. Lo que hay sobre la mesa para especificaciones futuras * puede * haber cambiado, pero nada de lo que haya escuchado al menos. –

1

El /g estaba causando problemas. El siguiente código funciona bien.

<div id="test"></div> 
    <script type="text/javascript"> 
     var reg = /Date\(\d+\)/; //REGEX WITHOUT g 
     var d="Date(1286445750000)"; 
     $(function(){ 
      var $d=$("div#test"); 
      for(var i=0;i<100;i++){ 
       if(reg.test(d)){ 
        $d.html($d.html()+"<br/>Matched: ["+d+"]"); 
       } 
       else{ 
        $d.html($d.html()+"<br/>Not Matched: ["+d+"]"); 
       } 
      } 
     }); 
    </script>