吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 599|回复: 15
收起左侧

[求助] 一个正则的问题

[复制链接]
云烟成雨 发表于 2024-4-10 16:12
一个js正则,功能是校验邮箱:
[JavaScript] 纯文本查看 复制代码
^[A-Za-z0-9\u4e00-\u9fa5_.]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$


正则有两种方式,一个是//直接写,一个是构造函数,这个正则为什么直接写和构造函数结果不一样,构造函数好像结果是对的,直接//写校验有问题,代码如下,请大佬解答一下为什么//不行
[JavaScript] 纯文本查看 复制代码
const reg = /^[A-Za-z0-9\u4e00-\u9fa5_.]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
const regNew = new RegExp("^[A-Za-z0-9\u4e00-\u9fa5_.]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$")
const str = "12345@qq.com"
console.log(reg.test(str))
console.log(regNew.test(str))

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

mr88fang 发表于 2024-4-10 16:29
你这个正则表达写的应该是有问题的,在这里测试一下 https://www.jyshare.com/front-end/854/

去看下 MDN 里面怎么说的

当设置全局标志的正则使用test()
如果正则表达式设置了全局标志,test() 的执行会改变正则表达式 lastIndex属性。连续的执行test()方法,后续的执行将会从 lastIndex 处开始匹配字符串,(exec() 同样改变正则本身的 lastIndex 属性值).

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test
 楼主| 云烟成雨 发表于 2024-4-10 16:49
mr88fang 发表于 2024-4-10 16:29
你这个正则表达写的应该是有问题的,在这里测试一下 https://www.jyshare.com/front-end/854/

去看下 MD ...

这个网站使用的是字面量正则,我这个例子字面量正则写的时候就有问题,所以匹配不对,如果是构造函数字符串的方式就没有问题,但是我想不通字面量正则为啥就不对了
mr88fang 发表于 2024-4-10 16:54
本帖最后由 mr88fang 于 2024-4-10 16:55 编辑
云烟成雨 发表于 2024-4-10 16:49
这个网站使用的是字面量正则,我这个例子字面量正则写的时候就有问题,所以匹配不对,如果是构造函数字符 ...

字面量形式和构造函数形式在处理某些特殊字符时有所不同。例如,当正则表达式中包含特殊字符(如^、$、*、+等)时,构造函数形式需要对这些字符进行转义


const reg = /^[A-Za-z0-9\u4e00-\u9fa5_.]+@[a-zA-Z0-9_-]+\.[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/;
const regNew = new RegExp("^[A-Za-z0-9\\u4e00-\\u9fa5_.]+@[a-zA-Z0-9_-]+\\.[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$");
const str = "12345@qq.com";
console.log(reg.test(str)); // 应该输出: true
console.log(regNew.test(str)); // 应该输出: true
mr88fang 发表于 2024-4-10 16:57
mr88fang 发表于 2024-4-10 16:54
[md]> 字面量形式和构造函数形式在处理某些特殊字符时有所不同。例如,当正则表达式中包含特殊字符(如 ...

输出的应该是 false,因为你正则匹配后面还有个点。12345@qq.com.cc 这样才能成功
 楼主| 云烟成雨 发表于 2024-4-10 16:59
mr88fang 发表于 2024-4-10 16:54
[md]> 字面量形式和构造函数形式在处理某些特殊字符时有所不同。例如,当正则表达式中包含特殊字符(如 ...

感觉该转义的已经转义过了,但是字面量输出的是false,点字符用一个反斜杠就可以了吧,要两个吗
mr88fang 发表于 2024-4-10 17:05
云烟成雨 发表于 2024-4-10 16:59
感觉该转义的已经转义过了,但是字面量输出的是false,点字符用一个反斜杠就可以了吧,要两个吗

是的,你试试上面那个就知道了
 楼主| 云烟成雨 发表于 2024-4-10 17:31
mr88fang 发表于 2024-4-10 17:05
是的,你试试上面那个就知道了

你那个输出了两个false,没有两个点吧,一个点就可以,最后那个只是说需要以.xxx结尾
kittylang 发表于 2024-4-10 17:40
实际上,如上面带佬所说,错误的不是字面量,而是构造函数你最后使用的(xxx)+需要匹配的是xx@xx.xx.xx应该把+号改为?才能匹配xx@xx.xx
kittylang 发表于 2024-4-10 17:43
运行结果不一致也如大佬所说,需要\转义。你最后那个\.不写成\\.就会被当成(.)任意字符而非点号。你所给的栗子应该返回两个false
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-16 03:57

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表