Regex c#:电子邮件中的姓氏,只包含一个连字符

本文关键字:包含一 连字符 电子邮件 Regex | 更新日期: 2023-09-27 18:14:07

朋友,我有一个使用名字的文本框。我所在组织的姓氏。姓氏可以包含也可以不包含连字符。如果它包括,那么它应该出现,1( 姓氏中只有一次2( 不在姓的开头3( 不在姓氏的末尾

我把这个Regex搞清楚了

^(?!.{51}([a-zA-Z]+(?:[.][a-zA-Z-]+(?$

这包括姓氏中的"-"。但不满足上述条件。

我仍在学习正则表达式,并且正在花时间来弄清楚这一点。请帮助

-感谢

Regex c#:电子邮件中的姓氏,只包含一个连字符

您需要在姓氏部分中再添加一个嵌套组:

^(?!.{51})[a-zA-Z]+(?:'.[a-zA-Z]+(?:-[a-zA-Z]+)?)?$
                                 ^^^^^^^^^^^^^^^ 

查看regex演示

详细信息

  • ^-字符串的开头
  • (?!.{51})-字符串要求中不超过50个字符
  • [a-zA-Z]+-1+ASCII字母
  • (?:'.[a-zA-Z]+(?:-[a-zA-Z]+)?)?-可选序列:
    • '.-一个点
    • [a-zA-Z]+-1个或多个ASCII字母
    • (?:-[a-zA-Z]+)?-可选序列:
      • --连字符
      • [a-zA-Z]+-1+ASCII字母
  • $—字符串结束

要声明此模式,请使用逐字逐句的字符串文字:

var pattern = @"^(?!.{51})[a-zA-Z]+(?:'.[a-zA-Z]+(?:-[a-zA-Z]+)?)?$";

要匹配任何Unicode字母,请使用'p{L}而不是[a-zA-Z]

这是一个快速而肮脏的解决方案。

^(?!.{51})[a-zA-Z]+.{1}[a-zA-Z]{1,}-?[a-zA-Z]+$

字符串的第一部分仍然由您使用。它看起来很完美。我的附加.{1}[a-zA-Z]{1,}-?[a-zA-Z]+简单地描述了接下来会发生什么。

  1. [a-zA-Z]{1,}确保点后至少有一个字符,因此不能将"-"作为开头。

  2. -?只是描述了在写完第一个字符后的某个地方可能会出现一个"-"。

  3. [a-zA-Z]+只是说,用户想要多少字符就有多少字符。但不再是"-">