【问题标题】:Regex match string 3-6 characters long, at least one letter, no duplicate "-"正则表达式匹配字符串 3-6 个字符长,至少一个字母,不能重复“-”
【发布时间】:2021-01-11 10:55:05
【问题描述】:

我必须匹配一个长度为 3-6 个字符的字符串,至少包含一个字母,但可以包含字母、数字和只有 1 个“-”。 “-”不能在开头或开头。

匹配:

string
str-ng
st-ng
s1-1g
st-1g

不匹配:

strings
-string
string-
st--ng
s-tn-g
1111
st

我得到的最接近的是:

^((?!-.*-)[0-9A-Z]{3,6})$

但这将正则表达式匹配与- 分开所以它匹配s-tri 但不匹配st-ri,因为每端没有3个字符

【问题讨论】:

    标签: regex


    【解决方案1】:

    也许你可以使用:

    ^(?=.*[a-z])(?!-|.*-$|.*-.*-)[a-z\d-]{3,6}$
    

    在线查看demo

    • ^ - 开始字符串锚点。
    • (?=.*[a-z]) - 积极前瞻以确保至少有一个字母。
    • (?!-|.*-$|.*-.*-) - 负预测以防止在开头在结尾多个连字符。
    • [a-z\d-]{3,6} - 三到六次来自 give 类的字符。
    • $ - 结束字符串锚。

    请注意,我使用了不区分大小写的标志。

    【讨论】:

      【解决方案2】:

      你可以使用

      ^(?=.{3,6}$)(?=[^a-zA-Z]*[A-Za-z])[0-9a-zA-Z]+(?:-[0-9a-zA-Z]+)?$
      

      请参阅regex demo。详情:

      • ^ - 字符串开头
      • (?=.{3,6}$) - 字符串必须包含三到六个字符,而不是换行符
      • (?=[^a-zA-Z]*[A-Za-z]) - 字符串中必须至少有一个 ASCII 字母
      • [0-9a-zA-Z]+ - 一个或多个字母数字 ASCII 字符
      • (?:-[0-9a-zA-Z]+)? - - 的可选序列,然后是一个或多个字母数字 ASCII 字符
      • $ - 字符串结束。

      【讨论】:

        【解决方案3】:

        查看您尝试过的模式,您的意思是当存在 2 个连字符时使用否定前瞻排除匹配项。

        这部分[0-9A-Z]{3,6} 也不匹配连字符。

        阅读

        “-”不能在开头或开头。

        你可以这样做

        ^(?![^\n-]*-[^\n-]*-)(?=[^a-zA-Z\n]*[a-zA-Z])[a-zA-Z0-9][a-zA-Z0-9-]{2,5}$
        

        Regex demo

        如果你的意思最后也没有-

        ^(?![^\n-]*-[^\n-]*-)(?=[^a-zA-Z\n]*[a-zA-Z])[a-zA-Z0-9][a-zA-Z0-9-]{1,4}[a-zA-Z0-9]$
        

        说明

        • ^ 字符串开始
        • (?![^\n-]*-[^\n-]*-) 断言不是 2 次 -
        • (?=[^a-zA-Z\n]*[a-zA-Z]) 断言一个字符 a-zA-Z
        • [a-zA-Z0-9] 匹配没有- 的列表之一
        • [a-zA-Z0-9-]{1,4} 重复 1-4 次列出的任何一项,包括 -
        • [a-zA-Z0-9] 匹配没有- 的列表之一
        • $字符串结束

        Regex demo

        【讨论】:

          猜你喜欢
          • 2021-02-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多