Java 正则表达式,不包括。。在email addy的后缀中

Java 正则表达式,不包括。。在email addy的后缀中,java,regex,Java,Regex,可能重复: 这是我的家庭作业,我已经做了一段时间了,我已经读了很多书,我觉得对于初学者来说,我已经非常熟悉正则表达式了 我试图找到一个正则表达式来验证/失效电子邮件列表。有两个地址给我带来了问题,我无法让它们同时验证正确的方法。我已经用了十几种不同的表达方式,这些表达方式适用于列表中的所有其他电子邮件,但我无法同时得到这两种表达方式 首先是地址 me@example..com - invalid someone.nothere@1.0.0.127 - valid 表达式中验证后缀的部分

可能重复:

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

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

首先是地址

me@example..com  - invalid
someone.nothere@1.0.0.127  - valid
表达式中验证后缀的部分

我最初是从

@.+\\.[[a-z]0-9]+
还有第二种模式,用来检查更多的无效地址,并对照两种模式检查电子邮件,一种模式检查有效性,另一种模式检查无效性,但我的教授说他希望所有这些都在表达上

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

我试过用很多很多不同的方式写它,但我很确定我只是用了不同的语法来表达这两个表达式

我知道我想要它做什么,我想要它匹配“character+”的字符类+

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

我甚至尝试过用()将所有内容分组,并将{1}放在转义后。将\w改为a-z,并将+替换为{1,};似乎没有什么东西需要句点被字符包围。

您需要一个负面展望:

用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> 
至少匹配一个单词字符,后跟“.”。这至少会重复一次,然后至少再跟上一个单词字符。

我想您需要这样:

@[\\w]+(\\.[\\w]+)+
这与后跟一个或多个“.”“word”序列的“word”匹配。(您也可以用另一种方式进行分组;例如,参见Dailin的答案。)

您之前所做的工作的问题是,您试图在角色类中嵌入一个repeat。这没有意义,也没有语法支持它。字符类定义一组字符并与一个字符匹配。仅此而已。

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

(?:[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])?

你不能像那样嵌套角色类;多读一点关于字符类的书,了解它的含义,然后看看子模式。我想看他向他的教授解释一下,抱歉,它是java,不知道它改变了多少东西,编译了多少东西,但使所有东西都失效了。正如我们在这篇文章中看到的那样,可以在java中使用环顾一下……好的,当我设置为\\w+\.(?!\\)\\w+时,它会使无效地址无效,但仍不接受ip地址。如果我将整个内容设置为至少一个字符类,那么这两个地址将再次有效。@(\\w+\.(?!\\)+\\w+有效,非常感谢,我可以看到消极前瞻将非常有用。该解决方案也有效,谢谢Dallin。我尝试过类似的方法,但我错误地尝试嵌套字符类,而不是使用分组。。。比如@[\\w]+\.]+[\\w]+…是的,关于我的错误你是对的,谢谢你向我解释
@[\\w]+(\\.[\\w]+)+
(?:[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])+)\])
[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?