白左
千年狐狸
千年狐狸
  • UID34985
  • 注册日期2010-12-29
  • 最后登录2023-11-13
  • 发帖数2039
  • 经验655枚
  • 威望0点
  • 贡献值364点
  • 好评度69点
  • 社区居民
  • 忠实会员
阅读:1424回复:2

【已解决】String.prototype.match() 的疑问

楼主#
更多 发布于:2014-04-05 16:00
今天调试脚本时总是提示括号未配对,但是又找不出错误的地方
弄了好半天,终于找到原因,结果竟然是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作为参数对性能没有影响
-いたんですか? -ええ、ずっと
aaaa007cn
千年狐狸
千年狐狸
  • UID23968
  • 注册日期2008-05-03
  • 最后登录2022-03-07
  • 发帖数1924
  • 经验1138枚
  • 威望1点
  • 贡献值232点
  • 好评度164点
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的参考
白左
千年狐狸
千年狐狸
  • UID34985
  • 注册日期2010-12-29
  • 最后登录2023-11-13
  • 发帖数2039
  • 经验655枚
  • 威望0点
  • 贡献值364点
  • 好评度69点
  • 社区居民
  • 忠实会员
2楼#
发布于:2014-04-06 12:53
没看见下面那个说明, 原来是这样, 我明白了!
非常感谢!
-いたんですか? -ええ、ずっと
游客

返回顶部