2016-10-22 17 views
0

我做一個正則表達式支票上的圖案function Object() {}匹配與Array.toString(),我使用語句用繩子(^)開始正則表達式不能在IE8

Array.toString().match(/^function\s+([^\(]+)/)

這種說法在工作現代瀏覽器和回報["function Array", "Array"]

但在Internet Explorer 8中,上述語句始終返回null。一些嘗試和錯誤之後,我發現,在^符號出現問題。當我將它刪除,以Array.toString().match(/function\s+([^\(]+)/),結果變成正確的。

但由於它不保證function關鍵字從頭開始,因此,可以給予一定的假陽性,後者正則表達式是不正確的邏輯。

我想知道有沒有解決或者我錯過了什麼?謝謝。

更新:

@nicael的建議後,我考了一堆的正則表達式,發現一個有趣的結果

Correct意味着它返回["function Array", "Array"]

  1. 匹配的字符串,而不是Array.toString() - >正確

function Array() { [native code] } '.match(/^function\s+([^\(]+)/)

  • 替換^.{1,10} - >null
  • Array.toString().match(/.{1,10}function\s+([^\(]+)/)

  • 替換^.+ - >null
  • Array.toString().match(/.+function\s+([^\(]+)/)

  • 替換^.{0} - >正確
  • Array.toString().match(/.{0}function\s+([^\(]+)/)

    最有趣的結果是與.{0},它的工作原理。但它實際上什麼都不匹配。我在想,如果Array.toString()實際輸出function...字符串之前的東西,但使用document.write()不能表現出來,但它仍然沒有解釋.{0}^不同(僅在IE8)

    最後更新如何:

    事實問題是Array.toString不會以單行返回多行函數字符串。所以,正確的正則表達式跨瀏覽器的工作將是 Array.toString().match(/[\r\n]?function\s+([^\(]+)/)

    +0

    至少你可能試圖輸出你的字符串來匹配,並看到問題。 – nicael

    +0

    @nicael是的,我實際上在Chrome和IE8中輸出字符串,它們是相同的,這就是爲什麼我掙扎,因爲字符串是平等的,所以我希望正則表達式可以在兩個瀏覽器中工作。我已經更新了這個問題以供參考 –

    +0

    ^在IE上隨時都會失敗?你有沒有試過檢查其他泛型病例?用$(字符串的結尾)表達任何表達式? – nicael

    回答

    0

    如果您在IE8的控制檯類型Array.toString(),你可以看到輸出字符串

    `function Array() { [native code] }` 
    

    相反,輸出

    ` 
    function Array() { 
        [native code] 
    } 
    ` 
    

    也就是說,在function之前有一個換行符。這就是爲什麼你的正則表達式不匹配。

    +0

    要使跨瀏覽器工作,正則表達式必須更改爲'/ [\ r \ n]?功能\ S +([^ \(] +)/' –