/(?=^[\w\W]{10,20}$)asd$/.test('I have a dream a asd'),为什么错了?

利用正向预测限定字符的长度,/(?=^[\w\W]{10,20}$)/
在加上以asd结尾,/asd$/
两者分开判断都是正确的,合起来的话哪里出错了?

阅读 1.4k
1 个回答

我所了解的是javascript零宽断言仅支持后置断言,也就是后面跟没跟某些数据,至于前置断言的话正常也是使用?<=,但是可惜JavaScript不支持,题主还是考虑使用其他的方法吧,如果题主只是想限制数量的话,把总数减去3不就可以了:

/[\w\W]{10,17}asd$/.test('I have a dream a asd')

那可以这么理解吧,?=^[\w\W]{10,20}$)这个零宽断言由于前面没有匹配项,而且匹配了开头和结束,但不占用匹配的结果,所以零宽断言能够匹配的就是开头的空字符'';这个可能不好理解,看看下面的代码:结果的确是匹配了开头的空格,

var s = /(?=^[\w\W]{10,20}$)/.exec('I have a dream a asd');
//s = ["", index: 0, input: "I have a dream a asd"]

所以这样的话正则后面的匹配也就是/(?=^[\w\W]{10,20}$)asd$/可以看作是''asd$这样的,其中''这个是匹配的开头空字符,也就是说,/(?=^[\w\W]{10,20}$)asd$/这个匹配的是空字符开头的,所以你在空字符后面需要继续匹配开头的部分,
/(?=^[\w\W]{10,20}$)I have a dream a asd$/.test('I have a dream a asd')也是true,所以就是由于匹配了开头的空字符所以整个匹配需要从头开始。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题