限制电子邮件地址开头的特殊字符的正则表达式。

3
请查看正则表达式。我希望确保正则表达式在@符号后和前面没有任何特殊字符。在中间,它可以允许任何组合。
现有的正则表达式:
@"^[^\W_](?:[\w.-]*[^\W_])?@(([a-zA-Z0-9]+)(\.))([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$"))"

例如,正则表达式不应该匹配:
abc@.sj.com
abc@-.sj-.com
SSDFF-SAF@-_.SAVAVSAV-_.IP

^ 后面插入 \b。不确定是否需要考虑 _。您也可以考虑将第一个 [\w-\.]+ 替换为 [^\W_][\w.-]* - Wiktor Stribiżew
它适用于除_之外的每个特殊符号。 我也需要包括它 @WiktorStribiżew - Arpita Dutta
那么请看我的回答。正如我所评论的,将第一个[\w-\.]+替换为[^\W_][\w.-]* - Wiktor Stribiżew
一个格式化提示:要插入代码段,请使用反引号 \``。 \code` 将显示为 code - Wiktor Stribiżew
2个回答

3

由于您认为_是特殊的字符,我建议在开头使用[^\W_],然后稍微重新排列起始部分。为了防止@前出现特殊字符,请确保那里有一个字母或数字。我还建议删除冗余的捕获组/将其转换为非捕获组:

@"^[^\W_](?:[\w.-]*[^\W_])?@(?:\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.|(?:[\w-]+\.)+)(?:[a-zA-Z]{2,3}|[0-9]{1,3})\]?$"

这里有一个演示,展示了这个正则表达式的匹配过程。

[^\W_](?:[\w.-]*[^\W_])? 匹配:

  • [^\W_] - 仅限数字或字母
  • (?:[\w.-]*[^\W_])? - 1 或 0 次出现:
    • [\w.-]* - 0+ 个字母、数字、_.-
    • [^\W_] - 仅限数字或字母

但它限制了电子邮件地址a!bc@site.com..我应该只在开头限制特殊字符。 - Arpita Dutta
@ArpitaDutta,你的正则表达式不允许在用户名中使用!。那么为什么要使用如此严格的模式呢?可以使用@"^\S+@\S+\.\S+$" - Wiktor Stribiżew
@Arpita,请查看我的注释,让我知道那是否是你所需要的。也许你需要在结尾处使用[a-zA-Z]{2,3}(Unicode等价物-\p{L}{2,3})。 - Wiktor Stribiżew
这是我的正则表达式:"[a-z0-9!#$%&'+/=?^_{|}~-]+(?:\.[a-z0-9!#$%&' * +/=?^_{|}~-]+)@(?:a-z0-9?\.)+a-z0-9?"。使用此正则表达式可以接受 ")]=}!><$%+./|",但我该如何从正则表达式中删除所有这些字符,特别是邮件地址的结尾部分? - Imen
@WiktorStribiżew,你应该在这里发布你的最新版本,而不是仅在之前回答中的“演示”链接中发布,因为它肯定会在一段时间后丢失。这绝对满足了我对电子邮件验证的所有需求。谢谢! - Patrice Cote
显示剩余9条评论

1
更改初始的[\w-\.]+[A-Za-z0-9\-\.]+
请注意,这将排除许多可接受的电子邮件地址。
更新:
正如指出的那样,[A-Za-z0-9]并不是\w的精确翻译。但是,您似乎对您认为的特殊字符有一个具体的定义,因此在方括号中定义允许的内容可能更容易实现。

在.NET中,\w匹配的是[\p{Ll}\p{Lu}\p{Lt}\p{Lo}\p{Lm}\p{Mn}\p{Nd}\p{Pc}],而不是[a-zA-Z0-9_] - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接