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

Posted

技术标签:

【中文标题】电子邮件的正则表达式用户名应以 [a-zA-Z0-9] 开头或结尾,但可能包含破折号、下划线【英文标题】:Regex UserName for email should start or end with [a-zA-Z0-9] but may contain dash,underscore in between 【发布时间】:2020-12-11 14:49:31 【问题描述】:

关于电子邮件/用户名正则表达式有很多问题,我不打算添加,但我找不到确切的答案。我正在尝试匹配和替换给定字符串中的电子邮件 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: *** , -***, x-@xx.co.uk , xx@xx-.com, ***-

电流输出Emails: *** , ***, *** , ***, ***

它会替换整个 -x@x.co.uk,因为它应该只替换 x@x.co.uk 并忽略连字符。

【问题讨论】:

您的第三个条件不清楚:根据您的句子的第一部分允许“a-”(“必须以 [a-zA-z0-9] 开头或结尾”),但不是根据第二部分(“不应以 [ \._- ] 开头或结尾”) 另外,我没有得到“xx@xx-.com”的例子。域“xx-.com”似乎满足所有条件,但您希望它能够匹配吗? 所以系统会拒绝一个人的电子邮件(这在现实世界中有效),因为它没有通过你的测试?在任何系统中验证电子邮件作为用户名似乎是一件愚蠢的事情。 【参考方案1】:

[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]", 
    "***");

另外,请注意“.”也需要在 [] 内转义。

【讨论】:

以上是关于电子邮件的正则表达式用户名应以 [a-zA-Z0-9] 开头或结尾,但可能包含破折号、下划线的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式验证电子邮件

电子邮箱的正则表达式————呱呱二号

Javascript多电子邮件正则表达式验证

正则表达式

电子邮件的正则表达式在 mvc cshtml 中不起作用

正则表达式验证邮箱格式是啥?