求一条正则

harryCom 2011-02-16 05:11:47
求一条正则,需求有点复杂,可能需要加脚本辅助。
大概需求:
匹配一段字符串,字符串由email地址组成,可能有合法的地址和非法地址,需要将合法和非法的都匹配出来,我说一下合法的地址,合法地址包括这些:
一般常用的格式:account@xxx.com
特殊地址格式:"yyy"<account@xxx.com>, zzz<account@xxx.com>
以上xxx.com必须匹配为正确的域名,yyy可以为任何字符,zzz为除了空格和;,以外的字符

输入地址可能由多个email地址组成,由","或者";"分隔,要求结果匹配出每条的合法和非法的地址,并且合法的地址当是特殊的地址时,必须获取到yyy或者zzz和account@xxx.com部分

例如传入的字符串是:abc@163.com,"小 明"<xiaoming@gmail.com>;错误;小雪<xiaoxue@yahoo.com.cn>;wrong.com
要求返回的结果是:
{
match : [
{name : "", address : "abc@163.com"},
{name : "小 明", address : "xiaoming@gmail.com"},
{name : "小雪", address : "xiaoxue@yahoo.com.cn"}
],
wrong : ["错误", "wrong.com"]
}
...全文
256 18 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
prototyper 2011-02-20
  • 打赏
  • 举报
回复
[code=JScrip]
<script type=text/javascript>

String.prototype.chkMail = function() {
var json = {match : [], wrong : []};
this.replace(/("[^"]+"<)?[^,;]+/g, function($) {
var reg = /^"*([^<"]+)?["<]*(\b\w+@\w+(\.[a-zA-z]+){1,4})[>,;]*$/;
reg.test($) && json.match.push({name:RegExp.$1, address:RegExp.$2}) || json.wrong.push($);
})
return json
}

var str = 'abc@163.com,"小 ;明"<xiaoming@gmail.com>;错误;小雪<xiaoxue@yahoo.com.cn>;wrong.com,"小, ;,王"<xiaowang@gmail.com>';
alert(str.chkMail().match[3].name)

</script>
[/code]
prototyper 2011-02-20
  • 打赏
  • 举报
回复
感谢LZ给我了100分,这是我得到的最高可用分了,后来我想到了较为理想的匹配模式,外去未上网忘记贴上来,刚想起补充如下:
[code=JScrip]
<script type=text/javascript>

String.prototype.chkMail = function() {
var json = {match : [], wrong : []};
this.replace(/("[^"]+"<)?[^,;]+/g, function($) {
var reg = /^"*([^<"]+)?["<]*(\b\w+@\w+(\.[a-zA-z]+){1,4})[>,;]*$/;
reg.test($) && json.match.push({name:RegExp.$1, address:RegExp.$2}) || json.wrong.push($);
})
return json
}

var str = 'abc@163.com,"小 ;明"<xiaoming@gmail.com>;错误;小雪<xiaoxue@yahoo.com.cn>;wrong.com,"小, ;,王"<xiaowang@gmail.com>';
alert(str.chkMail().match[3].name)

</script>
[/code]
这样,就省去了一个replace(/[,;]+(?![^"]+"<)/g, "§")的mark替换过程,提高了效率,舒服了代码。再次改写LZ的100分!
prototyper 2011-02-18
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 varlj 的回复:]

凑个热闹

JScript code

var str = 'abc@163.com,"小 ;明"<xiaoming@gmail.com>;错误;小雪<xiaoxue@yahoo.com.cn>;wrong.com,"小, ;,王"<xiaowang@gmail.com>'; //加了条小王
var array = str.split(/[,;](?![^"]+"<)/g);
var j……
[/Quote]

嗯,[,;](?![^"]+"<)好。

<script type=text/javascript>

String.prototype.chkMail = function() {
var json = {match : [], wrong : []};
this.replace(/[,;]+(?![^"]+"<)/g, "§").replace(/[^§]+(?=§|$)/g, function($) {
reg = /^"*([^<"]+)?["<]*(\b\w+@\w+(\.[a-zA-z]+){1,4})[>,;]*$/;
reg.test($) && json.match.push({name:RegExp.$1, address:RegExp.$2}) || json.wrong.push($);
})
return json
}

var str = 'abc@163.com,"小 ;明"<xiaoming@gmail.com>;错误;小雪<xiaoxue@yahoo.com.cn>;wrong.com,"小, ;,王"<xiaowang@gmail.com>';
alert(str.chkMail().match[3].name)

</script>
harryCom 2011-02-18
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 cj205 的回复:]
之所以写这么麻烦,还是考虑了下一些规则 比如
"王明<dtest@gmail.com>
或者aaa<test@163.com
这样的
[/Quote]
确实还有这种错误的地址要考虑。

先感谢以上各位强人踊跃回复,经过我反复测试各种情况,prototyper的最后修改后的代码基本很完美了,再加上上面的两种错误类型判断,似乎比较难,我刚刚改为以下不太简洁的代码,不过也比现在正在用的恶心的实现方式强多了,大家看看还可不可以继续优化一下:

String.prototype.chkMail = function() {
var json = {match : [], wrong : []}, rAddr = "(\\b\\S+@([\\w\\-\\_]+\\.)+[\\w\\-]{2,7})";
this.replace(/[,;]+(?![^"]+"<)/g, "§").replace(/[^§]+(?=§|$)/g, function($) {
if(/[<>]/g.test($)){
if(/\"/g.test($)){
reg = new RegExp('^"([^<"]+)?"<'+ rAddr +'>$');
}else{
reg = new RegExp('^([^<"]+)?<'+ rAddr +'>$');
}
}else{
reg = new RegExp('^(^)'+ rAddr +'$');
}

reg.test($) && json.match.push({name:RegExp.$1, address:RegExp.$2}) || json.wrong.push($);
})
return json
}
alert(JSON.stringify('abc@163.com,"xyz"<1_1-2+abc@gmail.com>;"xyz<abc@gmail.com>;"xyz"abc@gmail.com>;"xyz"<ab c@gmail.com>;"小;,小;,明"<xiaoming@gmail.com>;错误;小雪<xiaoxue@yahoo.com.cn>;wrong.com'.chkMail()))
Mr-Jee 2011-02-17
  • 打赏
  • 举报
回复
之所以写这么麻烦,还是考虑了下一些规则 比如
"王明<dtest@gmail.com>
或者aaa<test@163.com
这样的
varlj 2011-02-17
  • 打赏
  • 举报
回复
凑个热闹


var str = 'abc@163.com,"小 ;明"<xiaoming@gmail.com>;错误;小雪<xiaoxue@yahoo.com.cn>;wrong.com,"小, ;,王"<xiaowang@gmail.com>'; //加了条小王
var array = str.split(/[,;](?![^"]+"<)/g);
var json = {match : [], wrong : []};
for(var i=0;i<array.length;i++){
if(/(?:"?([^"\n]*?)"?<)?(\w+@[\w.]+)/.exec(array[i])){
json.match.push({name:RegExp.$1,address:RegExp.$2});
}
else{
json.wrong.push(array[i]);
}
}
Mr-Jee 2011-02-17
  • 打赏
  • 举报
回复

function trimString(str) {
return str.replace(/^[<"]|[>"]$/g,"");
}
var str = 'abc@163.com,"小 明"<xiaoming@gmail.com>;错误;小雪<xiaoxue@yahoo.com.cn>;wrong.com';
var o = {
match:[],
wrong:[]
};
var strarr = str.split(/[,;]/g);
var reg = /^(?:("[^"]+"|[^<]*)(?=<))?(<\w+@\w+(?:\.\w+){1,2}>|\w+@\w+(?:\.\w+){1,2})$/i;
for(var i in strarr){
if(strarr[i].match(reg)) {
o.match.push({
name:trimString(RegExp.$1),
address:trimString(RegExp.$2)
});
}
else
o.wrong.push(strarr[i]);
}

Linares 2011-02-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 harrycom 的回复:]
to:Linares
你的代码不能将小雪的name匹配出来。
[/Quote]

不好意思,没注意意""可省:
var reg = /(?:"?([^",;]*)"?<)?(\w+@\w+\.com)>?/

我的思路是先按[,;]拆分,再验证email格式。拆分那个正则考虑的比较复杂,要排除"yyy"里面的,;,如果没有这种情况,直接[,;]拆分就可以了。
prototyper 2011-02-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 harrycom 的回复:]

to:Linares
你的代码不能将小雪的name匹配出来。

to:prototyper
你的代码很简介,果然基本一行代码可以实现,在我看来你已经是个强人,不过有个地方需要改一下,当地址的name部分有引号时,引号里面可以包括“,;”字符的,比如:"小,明"<xiaoming@gmail.com>是合法的。
[/Quote]

我刚看你你的回复,一时还没想到理想的匹配模式,也许换个思路会简单的多。毕竟,正则的要义是简洁。

<script type=text/javascript>

String.prototype.chkMail = function() {
var json = {match : [], wrong : []};
this.replace(/(".*)(,|;)(.*")/g, "$1 $3").replace(/[^;,]+(?=,|;|$)/g, function($) {
var obj = {}, reg = /^"*([^<"]+)?["<]*(\b\w+@\w+(\.[a-zA-z]+){1,2})>*$/;
reg.test($) && (obj.name=RegExp.$1, obj.address=RegExp.$2, json.match.push(obj)) || json.wrong.push($);
})
return json
}

alert('abc@163.com,"小; 明"<xiaoming@gmail.com>;错误;小雪<xiaoxue@yahoo.com.cn>;wrong.com'.chkMail().match[2].name)

</script>

harryCom 2011-02-17
  • 打赏
  • 举报
回复
to:Linares
你的代码不能将小雪的name匹配出来。

to:prototyper
你的代码很简介,果然基本一行代码可以实现,在我看来你已经是个强人,不过有个地方需要改一下,当地址的name部分有引号时,引号里面可以包括“,;”字符的,比如:"小,明"<xiaoming@gmail.com>是合法的。
kaifadi 2011-02-17
  • 打赏
  • 举报
回复
强人啊。我看了第一遍没看懂需求,再继续认真看一次!争取看懂!
harryCom 2011-02-17
  • 打赏
  • 举报
回复
不好意思,今天来晚了,我先仔细看看楼上的代码先
prototyper 2011-02-17
  • 打赏
  • 举报
回复
再稍微简化下下:

<script type=text/javascript>

String.prototype.chkMail = function() {
var json = {match : [], wrong : []};
this.replace(/[^,|;]+(?=,|;|$)/g, function($) {
var obj = {}, reg = /^"?([^;|,|<|"]*)?["<]*(\b\w+@\w+(\.[a-zA-z]+){1,2})>*$/;
reg.test($) && (obj.name=RegExp.$1, obj.address=RegExp.$2, json.match.push(obj)) || json.wrong.push($);
})
return json
}

alert('abc@163.com,"小 明"<xiaoming@gmail.com>;错误;小雪<xiaoxue@yahoo.com.cn>;wrong.com'.chkMail().match[0].address)

</script>
prototyper 2011-02-17
  • 打赏
  • 举报
回复
LZ,我不是版主,也不是强人,按照你的要求(你给出的JSON结构格式和健名)凑合着写了个方法,看是否能用。

<script type=text/javascript>

String.prototype.chkMail = function() {
var json = {match : [], wrong : []};
this.replace(/[^,|;]+(?=,|;|$)/g, function($) {
var obj = {}, reg = /^"?([^;|,|<|"]*)?["<]*(\b\w+@\w+(\.[a-zA-z]+){1,2})>*$/;
reg.test($) && (obj.name = RegExp.$1, obj.address = RegExp.$2) &&
json.match.push(obj) || json.wrong.push($);
})
return json
}

alert('abc@163.com,"小 明"<xiaoming@gmail.com>;错误;小雪<xiaoxue@yahoo.com.cn>;wrong.com'.chkMail().match.length)

</script>
Linares 2011-02-16
  • 打赏
  • 举报
回复
var str = 'abc@163.com,"小 明"<xiaoming@gmail.com>;错误;小雪<xiaoxue@yahoo.com.cn>;wrong.com';

var arr = str.split(/[,;](?=(?:[^"]*"[^"]*")*(?![^"]*"))/)
var obj = {match:[],wrong:[]};

var reg = /(?:"([^",;]*)"<)?(\w+@\w+\.com)>?/
for (var i=0; i<arr.length; i++)
{
if (reg.test(arr[i]))
obj.match.push({name:RegExp.$1,address:RegExp.$2})
else
obj.wrong.push(arr[i]);
}

alert(JSON.stringify(obj));
weakey 2011-02-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yhtapmys 的回复:]
召唤斑竹
[/Quote]

继续召唤。
yhtapmys 2011-02-16
  • 打赏
  • 举报
回复
召唤斑竹
yibey 2011-02-16
  • 打赏
  • 举报
回复
是很复杂的需求,坐等强人。

87,997

社区成员

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

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