很多人会这么写字符串匹配,结果似乎也对
'abcde'.match('cd')
// Array ["cd"]
实际这是错的,或者说某些情况是错的,来个例子
// 匹配京东全站
if( location.hostname.match('.jd.com') )
// 反例
'www.xjd.com'.match('.jd.com')
// Array ["xjd.com"]
道理很简单,match 的参数必须是正则,如果不是,会被隐式转换为正则。
因为是隐式转换,写的人可能没注意到,转换的结果可能和预期的不一致。
这里 dot 应该是纯字符串的一部分,被转换成了通配符。
new RegExp('.jd.com')
-> /.jd.com/
坑的是匹配结果放宽而不是收窄,所以调试不会出错,但是边界不对了。
应对方法是用 indexOf
'www.xjd.com'.indexOf('.jd.com') !== -1
// false
但是写起来有点长,多出 7 个字符(算上空格),我一般这么写
!!( 'www.xjd.com'.indexOf('.jd.com')+1 )
// false
因为基本都是写在 if 语句里的,所以不用显示转换
if( location.hostname.indexOf('.jd.com')+1 )
当然也可以用 match 加手动转义,但是太丑了
'www.xjd.com'.match('\\.jd\\.com')
// null
'www.xjd.com'.match(/\.jd\.com/)
// null
大家有什么好的方法说一下
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.