我必须在C#中验证一个"项目代码"字符串——字符串长度可以在5-10个字符之间。除此之外的唯一规则如下:
- 第一个字符只能是字母或数字
- 中间字符(如果存在)可以是字母、数字或句点(.)
- 最后一个字符只能是字母或数字
- *避免在中间的一行中使用多个句点
我可以验证5-10个字符的限制,如下所示:
^(?=.{5,10}$)
第1部分和第3部分是这样的:
[a-zA-Z0-9]{1}
中间规则是这样的:
[a-zA-Z0-9.]{0,8}
如果我把所有这些放在一起,我就得到了这个:
^(?=.{5,10}$)[a-zA-Z0-9]{1}[a-zA-Z0-9.]{0,8}[a-zA-Z0-9]{1}$
它工作得很好,但有了几乎相同的代码,它似乎可以以某种方式浓缩。有什么想法吗?谢谢
您可以将中间部分匹配3到8次,并将外部部分匹配一次,从而使其更短(您不需要{1})。这就不需要代码的5,10部分,因为1+3+1=5和1+8+1=10。
^[a-zA-Z0-9][a-zA-Z0-9.]{3,8}[a-zA-Z0-9]$
您可以使用
(?i)^(?!.*[.]{2})[a-z0-9][a-z0-9.]{3,8}[a-z0-9]$
参见演示
^[a-z0-9]
-第一个字符只能是字母或数字[a-z0-9.]{3,8}
-中间字符(如果存在)可以是字母、数字或句点(.
)[a-z0-9]$
-最后一个字符只能是字母或数字^(?!.*[.]{2})
-*避免中间一行中有多个句点
与new Regex()
初始值设定项一起使用时,(?i)
内联修饰符可以替换为RegexOptions.IgnoreCase
标志。
我要背上Cyral的答案,所以给他+1!我使用不区分大小写的标志从[a-zA-Z0-9]
到[a-z0-9]
^(?i)[a-z0-9][a-z0-9.]{3,8}[a-z0-9]$
谢谢大家!