复杂的Javascript Reg Exp
我已经搜索了之前关于Reg Exp的问题,但没有找到我需要的帮助。我是正则表达式的初学者,需要一个Javascript reg exp,将有效文件名限制为以下内容:复杂的Javascript Reg Exp,javascript,regex,Javascript,Regex,我已经搜索了之前关于Reg Exp的问题,但没有找到我需要的帮助。我是正则表达式的初学者,需要一个Javascript reg exp,将有效文件名限制为以下内容: 仅允许A-Za-z0-9.(字母数字、下划线、连字符、点) 但是,文件名不能以连字符或点开头 文件名不能以点结尾 文件名中只有个点,没有。 无空格 最大长度:255 我非常感谢您在这方面的帮助。此外,任何关于适当文件名的想法都是受欢迎的。我相信上述要求对我有帮助,但我总能听到更多关于这个问题的想法。我正在创建一个基于web的应用
- 仅允许
(字母数字、下划线、连字符、点)A-Za-z0-9.
- 但是,文件名不能以连字符或点开头
- 文件名不能以点结尾
- 文件名中只有个点,没有
。
- 无空格
- 最大长度:255
^(?!.*\..*\.)\w[\w.-]{0,253}[\w-]$|^\w$
说明:
-从字符串开头开始^
-a以确保没有两点(?!.\.*)
-相当于一个\w
字符A-Za-z0-9
-最多253个列出的可能字符[\w.-]{0253}
-所有可能的字符,点除外[\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,还不完全清楚。
是否只是一个例子。在评论中