JS正则表达式,请大家帮我看看为啥错误?

写了一个匹配邮箱的正则表达式,不知道为啥在@后面为字母时错误,为数字时正确。
w应该既能匹配数字也能匹配字母呀。

clipboard.png

阅读 4k
2 个回答
String#search
String#split
String#match
String#replace
RegExp#test
RegExp#exec

字符串的四个方法,每次匹配时,都是从0开始的,即lastIndex属性始终不变。

而正则实例的两个方法exectest,当正则是全局匹配时,每一次匹配完成后,都会修改lastIndex。下面让我们以test为例,看看你是否会迷糊:

var regex = /a/g;
console.log( regex.test("a"), regex.lastIndex );
console.log( regex.test("aba"), regex.lastIndex );
console.log( regex.test("ababc"), regex.lastIndex );
// => true 1
// => true 3
// => false 0

注意上面代码中的第三次调用test,因为这一次尝试匹配,开始从下标lastIndex3位置处开始查找,自然就找不到了。

如果没有g,自然都是从字符串第0个字符处开始尝试匹配:

var regex = /a/;
console.log( regex.test("a"), regex.lastIndex );
console.log( regex.test("aba"), regex.lastIndex );
console.log( regex.test("ababc"), regex.lastIndex );
// => true 0
// => true 0
// => true 0

摘抄自:老姚的文章正则表达式编程-2.4 修饰符g,对exex和test的影响
希望对你有帮助。

后面不要加g,全局匹配会保留上一次匹配到的index,并且下一次从index才开始匹配,会导致间歇性错误。

补充:
第一个匹配成功后的表达式对象截图
clipboard.png

lastIndex的文档说明

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