复杂的Javascript Reg Exp

复杂的Javascript Reg Exp,javascript,regex,Javascript,Regex,我已经搜索了之前关于Reg Exp的问题,但没有找到我需要的帮助。我是正则表达式的初学者,需要一个Javascript reg exp,将有效文件名限制为以下内容: 仅允许A-Za-z0-9.(字母数字、下划线、连字符、点) 但是,文件名不能以连字符或点开头 文件名不能以点结尾 文件名中只有个点,没有。 无空格 最大长度:255 我非常感谢您在这方面的帮助。此外,任何关于适当文件名的想法都是受欢迎的。我相信上述要求对我有帮助,但我总能听到更多关于这个问题的想法。我正在创建一个基于web的应用

我已经搜索了之前关于Reg Exp的问题,但没有找到我需要的帮助。我是正则表达式的初学者,需要一个Javascript reg exp,将有效文件名限制为以下内容:

  • 仅允许
    A-Za-z0-9.
    (字母数字、下划线、连字符、点)
  • 但是,文件名不能以连字符或点开头
  • 文件名不能以点结尾
  • 文件名中只有点,没有
  • 空格
  • 最大长度:255
我非常感谢您在这方面的帮助。此外,任何关于适当文件名的想法都是受欢迎的。我相信上述要求对我有帮助,但我总能听到更多关于这个问题的想法。我正在创建一个基于web的应用程序,人们可以在其中上载文档。我更喜欢只创建通用文件名限制,而不关心操作系统类型。谢谢

^(?!.*\..*\.)\w[\w.-]{0,253}[\w-]$|^\w$

说明:

  • ^
    -从字符串开头开始
  • (?!.\.*)
    -a以确保没有两点
  • \w
    -相当于一个
    A-Za-z0-9
    字符
  • [\w.-]{0253}
    -最多253个列出的可能字符
  • [\w-]
    -所有可能的字符,点除外
  • $
    -字符串的结尾
  • |^\w$
    -所有这些或单个
    a-Za-z0-9
    字符

    • 这个正则表达式非常接近。唯一的问题是它不匹配两个或多个连续点

      var fileRegex = /^[\w][\w-\.]{0,253}[\w-]$/
      
      崩溃

      /^[\w]
      -它只能以单词字符开头,不能以点或连字符开头

      [\w-\.]
      -可以包含单词字符、连字符或点

      {0253}
      -匹配上一个表达式的0和253之间的值

      [\w-]$
      -只能以单词字符或连字符结尾

      下面是匹配连续点的正则表达式

      var dotRegex = /(\.)\1+/
      

      要查看字符串是否与正则表达式匹配,可以使用
      test
      方法。我们希望第一个正则表达式通过,第二个正则表达式失败

      fileRegex.test(字符串)&&!dotRegex.test(字符串)

      仅允许A-Za-z0-9。(字母数字、下划线、连字符、点)

      这是可以处理的

      result = /^[\w.-]+$/.test(input);
      
      result = !/^[-.]/.test(input);
      
      result = !/\.$/.test(input);
      
      result = !/\.\./.test(input);
      
      result = input.length < 256;
      
      但是,文件名不能以连字符或点开头

      这是可以处理的

      result = /^[\w.-]+$/.test(input);
      
      result = !/^[-.]/.test(input);
      
      result = !/\.$/.test(input);
      
      result = !/\.\./.test(input);
      
      result = input.length < 256;
      
      文件名不能以点结尾

      这是可以处理的

      result = /^[\w.-]+$/.test(input);
      
      result = !/^[-.]/.test(input);
      
      result = !/\.$/.test(input);
      
      result = !/\.\./.test(input);
      
      result = input.length < 256;
      
      文件名中只有一个点,没有

      这是可以处理的

      result = /^[\w.-]+$/.test(input);
      
      result = !/^[-.]/.test(input);
      
      result = !/\.$/.test(input);
      
      result = !/\.\./.test(input);
      
      result = input.length < 256;
      
      没有空间

      第一点已经解决了

      最大长度:255

      这是可以处理的

      result = /^[\w.-]+$/.test(input);
      
      result = !/^[-.]/.test(input);
      
      result = !/\.$/.test(input);
      
      result = !/\.\./.test(input);
      
      result = input.length < 256;
      
      result=input.length<256;
      

      所有这些加在一起,你就得到了:

      function validate(input) {
          return /^[\w.-]+$/.test(input) &&
              !/^[-.]/.test(input) &&
              !/\.$/.test(input) &&
              !/\.\./.test(input) &&
              input.length < 256;
      }
      
      功能验证(输入){
      返回/^[\w.-]+$/.test(输入)&&
      !/^[-.]/.测试(输入)&&
      !/\.$/.测试(输入)&&
      !/\.\./.测试(输入)&&
      输入长度<256;
      }
      

      它非常简单,易于阅读,易于调试。

      这是使用单个正则表达式进行调试的方法:

      ^(?!.*\.\.)(?=\w)[\w.-]{0,254}[\w-]$
      

      忘了添加,因为它不能以a开头。或者-,它也必须以有效字符开头:A-Za-z0-9_到目前为止您尝试了什么?你在服务器端做什么来保护那些不启用Javascript的人?为什么是regexp?您可以简单地测试几个规则,以触发一条明确的错误消息。例如,“开始”和“结束”很容易测试。只有A-Za-z0-9_-,没有多余的空格。它真的需要是单个正则表达式吗?像这样的重叠需求可以作为多个正则表达式(例如,
      if(str.match(/^[a-z0-9\-\.]+$/i)和&!str.match(/^\./)&&(…)
      )更具可读性啊,许多回复就像我发布回复一样。谢谢,我将尝试多重表达式路径。谢谢你的回复。我试过很多不同的字面表达和lookaheads/behinds。。。。我使用的网站允许测试正则表达式,但没有用。不知道如何创造我所需要的,所以我想我需要一些指导。至于为什么我会喜欢JavaScript,一旦我得到了它,那么我将能够理解它的PHP方面。虽然,你是对的,我应该提到我需要服务器端版本,以防它有很大的不同。这并不排除多个点。我理解的问题是,文件名不应该包含多个点,而不仅仅是连续的。即使如此,为什么要使用反向引用而不仅仅是
      /\.\.+/
      /\.{2,}/
      ?为什么不只是
      /\.\./
      ?只要找到两个连续的点,无论连续找到多少个点,它都是无效的。我相信我的意图是,一个有效的文件名可以在有效字符之间有一个点,而不是在开头或结尾,并且永远不会超过一个点。谢天谢地,我的意思是在有效字符之间不要超过一个点。所以没有连续的点。希望能澄清一些问题。这里有几个问题,这不会匹配单字符文件名,而且我相信这样做的目的是不允许文件名有两个连续的点,即
      ^(?。*.\.\)\w[\w.-]{0253}[\w-]$
      @aaron\u world\u traveler,我的理解是不应该有多个点,而不仅仅是连续的。如果是这种情况,可以很容易地修复我删除
      *
      ,如您所示。单字符文件名的优点。修正了。我想如果他试图匹配有效的文件名,那么两个不连续的点就可以了,因为在大多数操作系统上这是一个有效的文件名模式。另外,他的文章明确指出,
      no..
      我看不到任何地方可以让我选择一个答案而不是另一个答案。我需要出发了,回来后我会测试完你的精彩答案。我以后会发布对我有用的东西。谢谢@aaron\u world\u traveler,还不完全清楚
      是否只是一个例子。在评论中