以字符串 (^) 开头的正则表达式无法匹配 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"]
- 匹配字符串而不是
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
不是return一行的函数字符串而是多行的。所以跨浏览器工作的正确正则表达式将是
Array.toString().match(/[\r\n]?function\s+([^\(]+)/)
如果您在 IE8 控制台中键入 Array.toString()
,您可以看到输出 不是 字符串
`function Array() { [native code] }`
相反,输出是
`
function Array() {
[native code]
}
`
即function
前有一个换行符。这就是您的正则表达式不匹配的原因。
我正在对模式 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"]
- 匹配字符串而不是
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
不是return一行的函数字符串而是多行的。所以跨浏览器工作的正确正则表达式将是
Array.toString().match(/[\r\n]?function\s+([^\(]+)/)
如果您在 IE8 控制台中键入 Array.toString()
,您可以看到输出 不是 字符串
`function Array() { [native code] }`
相反,输出是
`
function Array() {
[native code]
}
`
即function
前有一个换行符。这就是您的正则表达式不匹配的原因。