电子邮件的正则表达式用户名应以 [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] 开头或结尾,但可能包含破折号、下划线的主要内容,如果未能解决你的问题,请参考以下文章