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 

Zarówno Chrome, jak i Firefox Konsole JavaScript potwierdzają. Co u diabła, chłopaki?Co jest nie tak z moim wyrażeń regularnych daty?

Edit: jeszcze prostsze przypadek testowy:

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 

To pokazuje, że zastępców true/false każdym razem ...

Odpowiedz

21

W twoim przypadku usunięcia modyfikator g od końca, na przykład:

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 

To błąd związany ze sposobem implementacji wyrażeń regularnych w ECMAScript 3, there's a great post on the details here.

+1

Złe zachowanie przeglądarki, które nie jest winą Microsoftu? Co daje? =) – RMorrisey

+1

Nadal nie planujecie dodania wsparcia dla lookbehind, heh? – NullUserException

+0

@NullUserException - Nie nadążam za tą częścią specyfikacji, niektórzy z regexów mogą ... ale ten artykuł ma kilka lat, choć jest to ten sam błąd co OP. Co na stole dla przyszłych specyfikacji * może * się zmieniło, ale nic o czym nie słyszałem. –

1

Wystąpił problem z /g. Poniższy kod działa dobrze.

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