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

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

条件

  1. 整个电子邮件 ID 可能包含 (a-z,A-Z, 0-9,.,-,_)
  2. 用户名或域可以是 1 个或多个字母,因此 x@y.z 是有效的电子邮件。
  3. 用户名和域必须以 [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”似乎满足所有条件,但您希望它能够匹配吗?
  • 所以系统会拒绝一个人的电子邮件(这在现实世界中有效),因为它没有通过你的测试?在任何系统中验证电子邮件作为用户名似乎是一件愚蠢的事情。

标签: c# regex string match


【解决方案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]", 
    "***");

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

【讨论】:

    猜你喜欢
    • 2011-02-01
    • 2021-11-09
    • 2015-01-07
    • 2010-12-11
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多