正则表达式c#:电子邮件中的姓氏只包含一个连字符

时间:2016-10-21 13:52:29

标签: c# regex

友 我有一个文本框,它为我的组织采用firstname.Lastname。 姓氏可能包含也可能不包括连字符。​​如果包含,则应显示, 1)姓氏只有一次 2)不在姓氏的开头 3)不在姓氏的末尾

我有这个正则表达式

  

^ [A-ZA-Z] +(?:[。] [A-ZA-Z - ] +)({51}?!)?$

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

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

- 谢谢你

2 个答案:

答案 0 :(得分:3)

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

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

请参阅regex demo

<强>详情:

  • ^ - 字符串开头
  • (?!.{51}) - 字符串要求中不超过50个字符
  • [a-zA-Z]+ - 1+ ASCII字母
  • (?:\.[a-zA-Z]+(?:-[a-zA-Z]+)?)? - 可选序列:
    • \. - 一个点
    • [a-zA-Z]+ - 一个或多个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]

答案 1 :(得分:0)

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

^(?!.{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,}确保点后面至少有一个charackter,因此不能将“ - ”写为开头。

  2. -?只是描述了在写完第一个字符后某处可能出现“ - ”。

  3. [a-zA-Z]+只是说可能会有与用户想要的一样多的字符。但不再是“ - ”了。