Regex 带有特定字符的正则表达式帮助

Regex 带有特定字符的正则表达式帮助,regex,Regex,我最近得到了一个问题的答案: 但现在我只想匹配其中有@符号的情况 原始正则表达式是: (?!.*([._%+-])\1)[A-Za-z0-9._%+-]+ 所以我试着: (?!.*([._%+-])\1)[A-Za-z0-9._%+-]+@(?!.*([._%+-])\1)[A-Za-z0-9._%+-]+ 但这不允许我的任何特殊角色跟随@符号 例如,上面匹配的是+foo.bar+-test+@m,而不是+foo.bar+-test+@m+ 你知道我做错了什么吗?你重新使用了backref

我最近得到了一个问题的答案:

但现在我只想匹配其中有@符号的情况

原始正则表达式是:

(?!.*([._%+-])\1)[A-Za-z0-9._%+-]+
所以我试着:

(?!.*([._%+-])\1)[A-Za-z0-9._%+-]+@(?!.*([._%+-])\1)[A-Za-z0-9._%+-]+
但这不允许我的任何特殊角色跟随@符号

例如,上面匹配的是+foo.bar+-test+@m,而不是+foo.bar+-test+@m+


你知道我做错了什么吗?

你重新使用了backreference\1,因此它阻止你再次匹配特殊字符。您根本不需要重复前瞻性断言。试一试

^(?!.*([._%+-])\1)(?=.*@)[\w.%+@-]+$
(?!.*([._%+-])\1)[A-Za-z0-9._%+-]+@[A-Za-z0-9._%+-]+

这里有一个关于非常有用的IMHO环顾断言的教程。上面的?=.*@就是一个例子。