我一直在使用以下标准为名称制作正则表达式:
仅包含ASCII字母(a-z
,A-Z
),数字(0-9
),句点(.
),下划线(_
)或破折号(-
)
以字母或数字开头,以字母或数字结尾
介于3到128个字符之间
没有相邻的句号,下划线或破折号。名称如my-_namespace
并且my--namespace
无效。
到目前为止,我已经提出了以下模式:
^[a-zA-Z0-9](?!.*--)[a-zA-Z0-9._-]{1,126}[A-Za-z0-9]$
这适用于相邻的连字符。如何合并没有相邻连字符,下划线和点的功能?
答案 0 :(得分:1)
^[a-zA-Z0-9]([0-9A-Za-z]|[\._-](?![\._-])){1,126}[a-zA-Z0-9]$
这部分避免了重复的字符[\._-](?![\._-])
所以你最终会在字符,数字和单点,单个下划线和单个破折号之间进行交替
答案 1 :(得分:1)
一种方法是在正则表达式的开头放置禁止这种组合的否定前瞻。
^(?!.*[\._-]{2})[a-zA-Z0-9][a-zA-Z0-9\._-]{1,126}[a-zA-Z0-9]$
答案 2 :(得分:0)
尝试使用下划线和点做同样的(?!。* - )负前瞻?像这样:
^[a-zA-Z0-9](?!.*--)(?!.*\.\.)(?!.*__)[a-zA-Z0-9._-]{1,126}[A-Za-z0-9]$
答案 3 :(得分:0)
你可能会超越前瞻和非捕捉群体:
^(?=.{3,128})[0-9A-Za-z](?:[0-9A-Za-z]|(?:[-_\.](?![-_\.])))+[0-9A-Za-z]$
^ ^ ^ ^ ^ ^
| | | | | |
Length Starts Either a Or a but Ends
check with letter sepatator not with
letter followed letter
by another
separator