2010-09-30 50 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 

Chrome和Firefox JavaScript控制檯都確認。這到底是什麼,夥計?我的日期正則表達式有什麼問題?

編輯:更簡單的測試用例:

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 

這表明,交替真/假,每次...

回答

21

在你的情況下,從末尾刪除g修改,例如:

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 

這是ECMAScript 3,there's a great post on the details here中實現正則表達式的一種錯誤。

+1

一個不好的瀏覽器行爲是不是微軟的錯誤?是什麼賦予了? =) – RMorrisey 2010-09-30 03:35:41

+1

仍然沒有計劃添加lookbehind支持,嘿? – NullUserException 2010-09-30 03:37:55

+0

@NullUserException - 我沒有跟上這部分規範真的,一些正則表達式的人可能......但這篇文章已經過了幾年了,儘管它與OP看到的錯誤是一樣的。未來的規格可能會改變,但至少沒有聽說過。 – 2010-09-30 03:43:18

1

/g導致問題。以下代碼工作正常。

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