【发布时间】:2021-04-27 17:28:43
【问题描述】:
我正在尝试为一个人名的字符串编写一个正则表达式。这些是以下限制:
- 最多可以包含 1 个 - 符号(可以是无)
- 最多可以包含 1 个 ' 符号(可以没有)
- 不能有两个相邻的空格
- 空格前必须跟一个字母(a-z 或 A-Z)
- 字符串最多包含 20 个字符
- 字符串必须以字母开头(a-z 或 A-Z)
这是我目前的表达方式:
^(?!.*[ ]{2})(?!(.*?-){2})(?!(.*?'){2})([a-zA-Z])([(?<=[a-zA-Z]) (?=[a-zA-Z])][a-zA-Z0-9\-']*){0,19}$
我缺少的是检查以确保空格前后都有一个字母。任何关于如何合并的建议都非常受欢迎。谢谢!
【问题讨论】:
-
添加一个有效的阳性测试用例并使用regex101.com
-
可能是这样的
^[a-zA-Z](?!.*(['-]).*\1)(?!.* )(?=.{0,19}$)[a-zA-Z0-9'-]*(?:[a-zA-Z] [a-zA-Z][a-zA-Z0-9'-]*)*$regex101.com/r/UPySgp/1 -
或者后视也允许
a blike^[a-zA-Z](?!.*(['-]).*\1)(?!.* )(?=.{0,19}$)[a-zA-Z0-9'-]*(?:(?<=[a-zA-Z]) [a-zA-Z][a-zA-Z0-9'-]*)*$regex101.com/r/QKXOw0/1 -
天哪,谢谢你!它有效 :) 我取出了数字,因为那些是不允许的(也忘了提到那个规则),它是完美的。你也让我写的更好,所以谢谢你!
-
虽然这可以通过正则表达式来完成,但编写一些代码进行检查可能更清晰、更简单。