阅读:1424回复:2
【已解决】String.prototype.match() 的疑问
今天调试脚本时总是提示括号未配对,但是又找不出错误的地方
弄了好半天,终于找到原因,结果竟然是match函数中的字符串参数的括号没配对造成的 下图是fx29b和chrome 35.0.1898.0的对比,二者的行为一模一样 图片:1.png 在.Net中match函数的参数可以是字符串也可以是正则,当参数是字符串时,搜索串不做任何转义处理,所以也不会进行任何的语法检查,只是单纯的匹配char数组 而到了js中似乎有点不一样,虽然我是用字符串来匹配,但是字符串中的未配对括号竟然也导致了语法异常…… 按照MDN中的相关描述,这个函数实际上只接受regex作为参数 那么,我是否可以理解为,match接受字符串作为参数的写法实际上是一种方言,浏览器自动地把字符串转化为了相应的regex(如在chrome中可以看出,三种写法全部都对应/abc(/) ;那么问题在于,从上图可以看出,如果使用字符串,即使采用转义写法,解释器也不是不认的 在.Net中,使用字符串代替regex是处于性能考虑,既然js中都是转换为regex,那么是否就说明: 1. 用字符串作为match的参数时,无法匹配不成对的括号 2. 采用字符串和regex作为参数对性能没有影响 |
|
|
1楼#
发布于:2014-04-05 19:59
那个MDN页面
If a non-RegExp object obj is passed, it is implicitly converted to a RegExp by using new RegExp(obj). 所以你的str.match(patt)实际上等价于str.match(new Regex(patt)) 你的转义写法有错 参考 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp When using the constructor function, the normal string escape rules (preceding special characters with \ when included in a string) are necessary. For example, the following are equivalent:var re = /\w+/; var re = new RegExp("\\w+"); 至于.net的Regex.Match http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.match.aspx 那是两码事吧,不要用来做javascript的参考 |
|
|
2楼#
发布于:2014-04-06 12:53
没看见下面那个说明, 原来是这样, 我明白了!
非常感谢! |
|
|