问题描述
关于电子邮件/用户名正则表达式有很多问题,我不打算添加,但找不到确切答案。我正在尝试匹配并替换给定字符串中的电子邮件ID。
条件:
- 整个电子邮件ID可能包含(a-z,A-Z,0-9,。,-,_)
- 用户名或域可以是1个或多个字母,因此
x@y.z
是有效的电子邮件。 - 用户名和域必须以[a-zA-z0-9]开头或结尾。即不应以[._-] 开头或结尾
我使用以下代码用***(3个星号)替换它们。
string replacedtext = Regex.Replace("Emails: x@x.co.uk,-x@x.co.uk,x-@xx.co.uk,xx@xx-.com,xx@x.x.com-",@"[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z-_]{2,6}","***");
在大多数情况下效果很好,但在某些情况下失败。
所需的输出:Emails: ***,-***,***-
当前输出:Emails: ***,***,***
它将替换整个-x@x.co.uk
,因为它只应替换x@x.co.uk
而忽略连字符。
解决方法
将[a-zA-Z0-9._-]+
替换为[a-zA-Z0-9]([a-zA-Z0-9\._-]*[a-zA-Z0-9])?
。
换句话说:一个(字母或数字),然后可以选择后面跟任意数字或(字母/数字/破折号/破折号)+另一个(字母或数字)
Regex.Replace(
"Emails: x@x.co.uk,-x@x.co.uk,x-@xx.co.uk,xx@xx-.com,xx@x.x.com-",@"[a-zA-Z0-9]([a-zA-Z0-9._-]*[a-zA-Z0-9])?@[a-zA-Z0-9][a-zA-Z0-9._-]*?\.[a-zA-Z0-9._-]*[a-zA-Z0-9]","***");
此外,请注意“。”也需要在[]
内保留。