我正在尝试为文件和目录路径验证创建一个regEx。 我已经实现了这个,但它失败了1个条件,它不应该允许多个斜杠在一起。 此外,不应允许其他特殊字符
var x = /^(\\|\/){1}([a-zA-Z0-9\s\-_\@\-\^!#$%&]*?(\\|\/)?)+(\.[a-z\/\/]+)?$/i
可以建议如何解决这个问题吗?
答案 0 :(得分:0)
路径//asdf
在LINUX,UNIX,iOS和Android上有效,因此您的代码已经有效。但是,如果由于某种原因使某些特定的有效路径无效很重要,只需在[a-z ...]字符组后面用加号代替星号。这将导致多个路径分隔符无效而没有中间字符。
使用正则表达式方法和详细信息评论较大问题可能很有用。
1)您可以使用[\ /]而不是(\ | /),但两者都会在操作系统和文件系统的每个组合上允许误报。 (需要正斜杠的那些应该将反斜杠排除为分隔符,反之亦然。)
2)问题中的字符范围[a-zA-Z0-9 \ s -_ \ @ - \ ^!#$%&]不是任何已知组合的目录路径元素的允许字符范围操作系统和文件系统。例如,句点在大多数目录名中有效。
3)允许的字符范围不可移植。 (测试路径验证的最可靠方法是触摸实际文件系统上的文件名,这意味着实际实例化一个空文件并捕获实例化失败的任何指示。)
4)在星号后或第二个(\ | /)组之后,您不需要或不需要问号。他们不会创建一个bug,但是他们会浪费编译或运行时间,并且会混淆你的正则表达目的。
5)您还需要在扩展名之前重复字符范围或重新排列,如下例所示。
6)如果在正则表达式的末尾使用\ i作为标记,则不需要将A-Z范围添加到a-z范围。
7)从所需结果列表中可以看出,相对路径将被过滤掉,但没有明确提及解决方案的规则。
犹豫不决,提供此代码是为了演示上述一些改进。
// This code is not production worthy
// for reasons (1) through (3) given
// above and is provided only for the
// purpose of clarifying points made.
var re = /^([\\/][a-z0-9\s\-_\@\-\^!#$%&]*)+(\.[a-z][a-z0-9]+)?$/i
console.log(
[
'/',
'/asdf',
'/asdf/scd.csv',
'//asdf',
'/asd/ads/c.csv/',
'asd/asfd/a'
].map(RegExp.prototype.test, re))

答案 1 :(得分:0)
请尝试使用/^(\/|([\\/][\w\s@^!#$%&-]+)+(\.[a-z]+[\\/]?)?)$/i
,这会强制每个斜杠之间至少匹配一个字符:
var regex = /^(\/|([\\/][\w\s@^!#$%&-]+)+(\.[a-z]+[\\/]?)?)$/i
console.log([
'/',
'/asdf',
'/asdf/scd.csv',
'//asdf',
'/asd/ads/c.csv/',
'asd/asfd/a'
].map(RegExp.prototype.test, regex))

答案 2 :(得分:0)
((\/[\w\s\.@^!#$%&-]+)+\/?)|\/[\w\.\s@^!#$%&-]*
对此进行测试以匹配您的样本输入,
np ++上的但是(即perl-regex风味),因为我没有使用javascript的经验。
因此,在风味独立的散文中也是如此。
“(斜线和角色多次,然后是可选的斜线)
或
斜线和零个或多个字符“。
注1:我添加了明确的“。”允许角色 注2:我假设你的“\ /”表示“显式斜杠,而不是反斜杠”。