电子邮件的正则表达式用户名应以[a-zA-Z0-9]开头或结尾,但中间可能包含破折号,下划线

问题描述

关于电子邮件/用户名正则表达式有很多问题,我不打算添加,但找不到确切答案。我正在尝试匹配并替换给定字符串中的电子邮件ID。

条件

  1. 整个电子邮件ID可能包含(a-z,A-Z,0-9,。,-,_)
  2. 用户名或域可以是1个或多个字母,因此x@y.z是有效的电子邮件。
  3. 用户名和域必须以[a-zA-z0-9]开头或结尾。即不应以[._-]
  4. 开头或结尾

我使用以下代码用***(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]","***");

此外,请注意“。”也需要在[]内保留。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...