Regex 仅包含[a-zA-Z0-9.-\uz]且最大长度为20且不能以';结尾的字符串的正则表达式语法';最多只能包含两个''; 问题

Regex 仅包含[a-zA-Z0-9.-\uz]且最大长度为20且不能以';结尾的字符串的正则表达式语法';最多只能包含两个''; 问题,regex,Regex,由于以下情况,我无法获取正则表达式语法: 长度1-20 只能包含以下字符a-zA-Z0-9。- 不能以 只能出现0、1或2次 输入 通过 以下项目应通过正则表达式验证 dummy.txt dummy.tar.gz .dummy dummy. dummy.dummy.tar.gz dummydummydummy.tar.gz 失败 以下项目应未通过正则表达式验证 dummy.txt dummy.tar.gz .dummy dummy. dummy.dummy.tar.gz dummyd

由于以下情况,我无法获取正则表达式语法:

  • 长度1-20
  • 只能包含以下字符
    a-zA-Z0-9。-
  • 不能以
  • 只能出现0、1或2次

输入 通过 以下项目应通过正则表达式验证

dummy.txt
dummy.tar.gz
.dummy
dummy.
dummy.dummy.tar.gz
dummydummydummy.tar.gz
失败 以下项目应未通过正则表达式验证

dummy.txt
dummy.tar.gz
.dummy
dummy.
dummy.dummy.tar.gz
dummydummydummy.tar.gz
  • 超过2个
  • 超过20个字符

  • 尝试 以下是我到目前为止使用的语法,它是有效的,但我不知道如何添加“不超过两个
    ”约束:

    ^[a-zA-Z0-9.-_]{1,20}(?<!\.)$
    
    ^[a-zA-Z0-9.-{1,20}?
    谢谢。

    简短介绍 既然你没有指定正则表达式的味道,我就假设一切都会发生


    代码

    第1版

    ^(?!(?:.*\.){3,})[\w.-]{1,20}(?<!\.)$
    
    输出 注意:下文仅显示匹配项

    dummy.txt
    dummy.tar.gz
    .dummy
    

    解释
    • ^
      在行首断言位置
    • (?!(?:.*\){3,})
      负前瞻确保以下内容不匹配
      • (?:.\..*){3,}
        匹配以下3次或更多次
        • *\。
          匹配任意字符任意次数,后跟一个点
    • [\w.-]{1,20}
      匹配集合中存在的任何字符(任何单词字符
      a-zA-Z0-9
      、点字符
      或连字符减号
      -
      的1到20次)
    • (?反向查找确保前面的内容与以下内容不匹配
      
      • \。
        点字符
        字面意思
    • $
      在行尾断言位置

    附加说明 根据
    \w
    可以匹配其他脚本中的非ASCII字符。
    如果您希望确保仅匹配ASCII字符,则可能需要将
    \w
    替换为
    [a-zA-Z0-9_]

    下面的报价是从

    \w
    代表“单词字符”。它始终与ASCII码匹配 字符
    [A-Za-z0-9.]
    。请注意包含下划线和 数字。在大多数支持Unicode的版本中,
    \w
    包括许多 来自其他脚本的字符。关于 实际包含哪些字符。来自的字母和数字 通常包括字母和表意文字。连接器 除下划线和数字符号以外的标点符号 数字可能包括也可能不包括。XML模式和XPath甚至包括
    \w
    中的所有符号。同样,Java、JavaScript和PCRE仅匹配 带有
    \w
    的ASCII字符


    您应该使用
    负前瞻(?!)
    “并且最多只能包含两个”这并不是说这是不可能的,只是说这不是
    regex
    的工作。还有其他更简单、更优雅的方法来实现这一目标。@axiac你是对的,还有其他更优雅的方法来进行这些检查,但regex确实允许并且是专门设计的-执行这样的任务。
    (?!(?:..*\){3,})
    正是这样做的。@ctwheels
    (?!(?:[^.]*\){3})
    足够快和好了。@WiktorStribiżew谢谢,我已经更新了我的答案以包含该代码(有适当的引用)在一些正则表达式中,
    \w
    不仅匹配
    a-zA-Z0-9
    ,还匹配其他字符,如
    é
    。因此,我建议在字符类
    []
    @RoryO'Kane中明确列出范围。谢谢,我在回答的末尾添加了一个注释,以包含此信息