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

Regex c#:电子邮件中的姓氏,仅包含一个连字符,c#,regex,C#,Regex,朋友们, 我有一个文本框,它取我所在组织的名字。 姓氏可能包含也可能不包含连字符。如果包含,则应显示, 1) 姓氏只有一次 2) 不是在姓氏的开头 3) 不是在姓氏的末尾 我已经弄明白了这个正则表达式 ^(?!{51})[a-zA-Z]+(?:[.][a-zA-Z-]+)$ 这包括姓氏中的“-”。但不满足上述条件 我仍在学习正则表达式,并正在花时间来解决这个问题。 请帮忙 -谢谢您需要在姓氏部分中再添加一个嵌套组: ^(?!.{51})[a-zA-Z]+(?:\.[a-zA-Z]+(?:-[a-

朋友们, 我有一个文本框,它取我所在组织的名字。 姓氏可能包含也可能不包含连字符。如果包含,则应显示, 1) 姓氏只有一次 2) 不是在姓氏的开头 3) 不是在姓氏的末尾

我已经弄明白了这个正则表达式

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

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

我仍在学习正则表达式,并正在花时间来解决这个问题。 请帮忙


-谢谢

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

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

详细信息

  • ^
    -字符串的开头
  • (?!.{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]+
简单地描述了接下来会发生什么

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

  • -?
    仅描述在写入第一个字符后的某处可能会出现“-”

  • [a-zA-Z]+
    只是说可能会有用户想要的任意多个字符。但不再是“-”了

  • 谢谢你。不仅仅是为了解决问题,也是为了向像我这样的初学者解释问题,让他们明白。