友 我有一个文本框,它为我的组织采用firstname.Lastname。 姓氏可能包含也可能不包括连字符。如果包含,则应显示, 1)姓氏只有一次 2)不在姓氏的开头 3)不在姓氏的末尾
我有这个正则表达式
^ [A-ZA-Z] +(?:[。] [A-ZA-Z - ] +)({51}?!)?$
这包括姓氏中的“ - ”。但不满足上述条件。
我还在学习正则表达式,并且花时间去弄清楚这一点。 请帮忙
- 谢谢你
答案 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]+
只是描述接下来会发生什么。
[a-zA-Z]{1,}
确保点后面至少有一个charackter,因此不能将“ - ”写为开头。
-?
只是描述了在写完第一个字符后某处可能出现“ - ”。
[a-zA-Z]+
只是说可能会有与用户想要的一样多的字符。但不再是“ - ”了。