名称的正则表达式不包含相邻句点(。),连字符( - )或下划线(_)

时间:2018-06-04 12:08:53

标签: regex regex-lookarounds regex-group

我一直在使用以下标准为名称制作正则表达式:

  1. 仅包含ASCII字母(a-zA-Z),数字(0-9),句点(.),下划线(_)或破折号(-

  2. 以字母或数字开头,以字母或数字结尾

  3. 介于3到128个字符之间

  4. 没有相邻的句号,下划线或破折号。名称如my-_namespace 并且my--namespace无效。

  5. 到目前为止,我已经提出了以下模式:

    ^[a-zA-Z0-9](?!.*--)[a-zA-Z0-9._-]{1,126}[A-Za-z0-9]$
    

    这适用于相邻的连字符。如何合并没有相邻连字符,下划线和点的功能?

4 个答案:

答案 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]$

Debuggex Demo

答案 2 :(得分:0)

尝试使用下划线和点做同样的(?!。* - )负前瞻?像这样:

^[a-zA-Z0-9](?!.*--)(?!.*\.\.)(?!.*__)[a-zA-Z0-9._-]{1,126}[A-Za-z0-9]$

答案 3 :(得分:0)

你可能会超越前瞻和非捕捉群体:

  1. 使用正向前瞻检查整个字符串的长度。
  2. 检查具有负前瞻的非重复分隔符。
  3. ^(?=.{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