0

可能重复:
使用正则表达式验证电子邮件地址

这是家庭作业,我已经做了一段时间了,我读了很多书,觉得我已经非常熟悉初学者的正则表达式了。

我正在尝试找到一个用于验证/使电子邮件列表无效的正则表达式。有两个地址给我带来了问题,我无法让它们同时验证正确的方法。我已经使用了十几种不同的表达方式,这些表达方式适用于列表中的所有其他电子邮件,但我无法同时得到这两个。

首先,地址。

me@example..com  - invalid
someone.nothere@1.0.0.127  - valid

我的表达式中验证后缀的部分

我最初是从

@.+\\.[[a-z]0-9]+

并且有第二种模式来检查更多无效地址,并根据两种模式检查电子邮件,一种检查有效性,另一种无效,但我的教授说他希望这一切都在表达。

@[[\\w]+\\.[\\w]+]+

或者

@[\\w]+\\.[\\w]+

我已经尝试过很多很多不同的方式,但我很确定我只是使用不同的语法来表达这两个表达式。

我知道我想要它做什么,我想要它匹配一个字符类 "character+"."character+"+

加号至少为一个。当我只允许字符类重复一次时,它适用于无效类(显然 ip 不匹配),但是当我允许字符类重复自身时,它匹配第二个周期,即使它不是前面有一个字符。我不明白为什么。

我什至尝试用 () 对所有内容进行分组,并将 {1} 放在转义后的 . 并将 \w 更改为 az 并将 + 替换为 {1,}; 似乎没有什么需要被字符包围的句号。

4

4 回答 4

0

官方标准RFC 2822描述了使用此正则表达式的有效电子邮件地址的语法:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

更实际的 RFC 2822 实现(如果我们省略使用双引号和方括号的语法),它仍然匹配 99.99% 的当今实际使用的所有电子邮件地址,它是:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
于 2012-10-18T00:09:24.807 回答
0
@([\\w]+\\.)+[\\w]+

匹配至少一个单词字符,后跟一个“.”。这至少重复一次,然后至少跟着更多的单词字符。

于 2012-10-17T23:18:45.020 回答
0

我想你想要这个:

@[\\w]+(\\.[\\w]+)+

这匹配一个“单词”,后跟一个或多个“。” “单词”序列。(您也可以反过来进行分组;例如,参见 Dailin 的回答。)

您之前所做的问题是您试图在字符类中嵌入重复。这没有意义,也没有任何语法可以支持它。字符类定义一组字符并匹配一个字符。而已。

于 2012-10-17T23:19:09.057 回答
0

你需要一个消极的前瞻

@\w+\.(?!\.)

http://www.regular-expressions.info/lookaround.html

在 Perl 中测试:

Perl> $_ = 'someone.nothere@1.0.0.127'
someone.nothere@1.0.0.127

Perl> print "OK\n" if /\@\w+\.(?!\.)/
OK
1

Perl> $_ = 'me@example..com'
me@example..com

Perl> print "OK\n" if /\@\w+\.(?!\.)/

Perl> 
于 2012-10-17T22:58:46.497 回答