云烟成雨 发表于 2024-4-10 16:12

一个正则的问题

一个js正则,功能是校验邮箱:^+@+\.+(\.+)+$

正则有两种方式,一个是//直接写,一个是构造函数,这个正则为什么直接写和构造函数结果不一样,构造函数好像结果是对的,直接//写校验有问题,代码如下,请大佬解答一下为什么//不行
const reg = /^+@+\.+(\.+)+$/
const regNew = new RegExp("^+@+\.+(\.+)+$")
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
这个网站使用的是字面量正则,我这个例子字面量正则写的时候就有问题,所以匹配不对,如果是构造函数字符 ...

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

```js


const reg = /^+@+\.+(\.+)+$/;
const regNew = new RegExp("^+@+\\.+(\\.+)+$");
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
> 字面量形式和构造函数形式在处理某些特殊字符时有所不同。例如,当正则表达式中包含特殊字符(如 ...

输出的应该是 false,因为你正则匹配后面还有个点。12345@qq.com.cc 这样才能成功

云烟成雨 发表于 2024-4-10 16:59

mr88fang 发表于 2024-4-10 16:54
> 字面量形式和构造函数形式在处理某些特殊字符时有所不同。例如,当正则表达式中包含特殊字符(如 ...

感觉该转义的已经转义过了,但是字面量输出的是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

实际上,如上面带佬所说,错误的不是字面量,而是构造函数{:1_925:}你最后使用的(xxx)+需要匹配的是xx@xx.xx.xx应该把+号改为?才能匹配xx@xx.xx

kittylang 发表于 2024-4-10 17:43

运行结果不一致也如大佬所说,需要\转义。你最后那个\.不写成\\.就会被当成(.)任意字符而非点号。你所给的栗子应该返回两个false
页: [1] 2
查看完整版本: 一个正则的问题