以字符串 (^) 开头的正则表达式无法匹配 IE8 中的 Array.toString()

Regular Expression with start of string (^) cannot match Array.toString() in IE8

我正在对模式 function Object() {} 进行正则表达式检查,我使用语句

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

此语句适用于现代浏览器和 returns ["function Array", "Array"]

但是在Internet Explorer 8中,上面的语句总是returnnull。经过一些尝试和错误后,我发现问题出现在 ^ 符号处。当我把它移到 Array.toString().match(/function\s+([^\(]+)/) 时,结果就正确了。

但是后面的正则表达式在逻辑上是不正确的,因为它不能保证function关键字从头开始,因此可能会给出一些误报。

我想知道是否有变通办法或者我遗漏了什么?谢谢你。

更新:

根据@nicael的建议,我测试了一堆正则表达式,发现了一个有趣的结果

Correct 表示 returns ["function Array", "Array"]

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

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

  1. ^替换为.{1,10} -> null

Array.toString().match(/.{1,10}function\s+([^\(]+)/)

  1. ^替换为.+ -> null

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

  1. ^替换为.{0} -> 正确

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

最有趣的结果是 .{0} 有效。但它实际上什么都不匹配。我在想如果 Array.toString() 实际上在 function... 字符串之前输出了一些东西但是使用 document.write() 不能显示它但它仍然没有解释 .{0}^ 有何不同(仅限 IE8)

最终更新:

原来问题出在Array.toString不是return一行的函数字符串而是多行的。所以跨浏览器工作的正确正则表达式将是 Array.toString().match(/[\r\n]?function\s+([^\(]+)/)

如果您在 IE8 控制台中键入 Array.toString(),您可以看到输出 不是 字符串

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

相反,输出是

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

function前有一个换行符。这就是您的正则表达式不匹配的原因。