正则表达式验证EMAIL的时候,输入内容过长,导致CPU占用率为100%,无响应!急!!!!!

yigui2001 2007-12-14 05:04:05
我的email正则表达式为:^([a-z0-9A-Z]+[-|\\._]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$

在输入的字符串比较短的时候,验证没有问题。
但是在输入字符较长,并且不符合email规则的时候,才会出现标题中的问题。
如果输入过长,但是符合这个email规则,也不会有这个问题!

那位高手出出马,提供一些意见!大家都有分!!!!!!
...全文
1525 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
shan1119 2007-12-19
  • 打赏
  • 举报
回复 1
java中也一样的,我试了一个不匹配又很长的字符串,就出现死循环的状态了.
  • 打赏
  • 举报
回复
我在Java中试试好像没有出现这种问题,你这个是JavaScript中的?
shan1119 2007-12-19
  • 打赏
  • 举报
回复
学习了,第一次知道这个问题.
yigui2001 2007-12-18
  • 打赏
  • 举报
回复
找了很多网站,还有验证了好多次,终于发现原因:

能匹配空字符串的子匹配不要循环无限次。如果括号内的子表达式中的每一部分都可以匹配 0 次,而这个括号整体又可以匹配无限次,匹配过程中可能死循环。虽然现在有些正则表达式引擎已经通过办法避免了这种情况出现死循环了,比如 .NET 的正则表达式,但是我们仍然应该尽量避免出现这种情况。如果我们在写表达式时遇到了死循环,也可以从这一点入手。


上面的正则表达式中刚好有这种情况出现,所以以后用到括号()的时候一定要注意。希望大家也能够提高警惕!

最后感谢huqilong,wangxf_8341提供了可以借鉴的方法!
yigui2001 2007-12-18
  • 打赏
  • 举报
回复
感谢大家的回复!
zhangbaokun 2007-12-16
  • 打赏
  • 举报
回复
我觉的很简单啊,再你用正则判断之前,先判断length如果length超了直接return ,下面就不判断了
Kit_LO 2007-12-16
  • 打赏
  • 举报
回复
不知道你用的是不是框架,
如果是e-mail 应该用email类型去校验,
你在后面再加一个string的类型去校验一个长度就可以了
淡定的峰哥 2007-12-16
  • 打赏
  • 举报
回复
提供一个完整的email验证规则
function checkEmail(emailStr) {
if (emailStr.length == 0) {
return true;
}
var emailPat = /^(.+)@(.+)$/;
var specialChars = "\\(\\)<>@,;:\\\\\\\"\\.\\[\\]";
var validChars = "[^\\s" + specialChars + "]";
var quotedUser = "(\"[^\"]*\")";
var ipDomainPat = /^(\d{1,3})[.](\d{1,3})[.](\d{1,3})[.](\d{1,3})$/;
var atom = validChars + "+";
var word = "(" + atom + "|" + quotedUser + ")";
var userPat = new RegExp("^" + word + "(\\." + word + ")*$");
var domainPat = new RegExp("^" + atom + "(\\." + atom + ")*$");
var matchArray = emailStr.match(emailPat);
if (matchArray == null) {
return false;
}
var user = matchArray[1];
var domain = matchArray[2];
if (user.match(userPat) == null) {
return false;
}
var IPArray = domain.match(ipDomainPat);
if (IPArray != null) {
for (var i = 1; i <= 4; i++) {
if (IPArray[i] > 255) {
return false;
}
}
return true;
}
var domainArray = domain.match(domainPat);
if (domainArray == null) {
return false;
}
var atomPat = new RegExp(atom, "g");
var domArr = domain.match(atomPat);
var len = domArr.length;
if ((domArr[domArr.length - 1].length < 2) || (domArr[domArr.length - 1].length > 3)) {
return false;
}
if (len < 2) {
return false;
}
return true;
}
返回true 正确,false 错误
应该不用怀疑,这是struts 的email验证规则
龙行天下2015 2007-12-16
  • 打赏
  • 举报
回复
解决方法:

一:使用下面的这个表达式:
w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*



jxl5201314 2007-12-15
  • 打赏
  • 举报
回复
用JavaScript写小程序做限制即可
池彩虹 2007-12-14
  • 打赏
  • 举报
回复
自己控制字节数哈~~不让无限输入
yigui2001 2007-12-14
  • 打赏
  • 举报
回复
有人知道吗?
yigui2001 2007-12-14
  • 打赏
  • 举报
回复
顺便说一下,我的提交方式是POST的,不过应该和提交方式没什么关系!
解决问题者,我再单独追加50分。

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧