如何编写正则表达式以限制姓名-姓氏模式,避免出现两个独立单字符的缩写形式?
调整正则表达式以禁止姓名姓氏均为单字符的情况
我完全理解你的需求——你希望保留那些至少有一个部分(名或姓)长度大于1的姓名格式,同时精准排除掉名和姓都是单字符(无论带不带点)的情况。
先分析下你原来的正则:^[a-zA-ZöÖşŞçÇüÜıİğĞ.]{1,}(?:\s{1}[a-zA-ZöÖşŞçÇüÜıİğĞ.]{1,})+$,它只要求每个姓名部分至少有1个字符,所以会误匹配R D或R. D.这类不符合要求的格式。
修改后的正则表达式
^(?![a-zA-ZöÖşŞçÇüÜıİğĞ.]\s[a-zA-ZöÖşŞçÇüÜıİğĞ.]$)(?![a-zA-ZöÖşŞçÇüÜıİğĞ.]\.\s[a-zA-ZöÖşŞçÇüÜıİğĞ.]\.$)[a-zA-ZöÖşŞçÇüÜıİğĞ.]{1,}(?:\s[a-zA-ZöÖşŞçÇüÜıİğĞ.]{1,})+$
关键逻辑解释
这个正则在你原有规则的基础上,新增了两个负向前瞻断言来排除非法情况:
(?![a-zA-ZöÖşŞçÇüÜıİğĞ.]\s[a-zA-ZöÖşŞçÇüÜıİğĞ.]$):专门排除不带点的单字符名+单字符姓(比如R D)的格式。(?![a-zA-ZöÖşŞçÇüÜıİğĞ.]\.\s[a-zA-ZöÖşŞçÇüÜıİğĞ.]\.$):专门排除带点的单字符名+带点的单字符姓(比如R. D.)的格式。- 后半部分保留了你原有的规则,确保姓名由至少两个部分组成,每个部分只能包含允许的字母(含土耳其语特殊字母)和点,且每个部分至少有1个字符。
验证结果
合法格式(会通过校验)
R DowneyRobert DR. DowneyRobert D.Robert Downey
非法格式(会被拒绝)
R DR. D.
如果之后需要支持包含中间名的多部分姓名(比如R J Downey),这个正则也能正常工作——只要不是所有部分都是单字符(带点或不带点),就会被允许。
内容的提问来源于stack exchange,提问作者muhammed.ozer




