2017-03-24 60 views
2

我正在尝试为文件和目录路径验证创建一个regEx。 我已经实现了这一点,但其失败的条件之一,它不应该允许即多个斜线在一起。 此外,没有其它特殊字符不应该被允许文件和目录正则表达式

var x = /^(\\|\/){1}([a-zA-Z0-9\s\-_\@\-\^!#$%&]*?(\\|\/)?)+(\.[a-z\/\/]+)?$/i 
  • 试验1 - > /(应该传递)
  • 试验2 - >/ASDF(应该传递)
  • 试验3 - >/ASDF/scd.csv(应该传递)
  • 试验4 - > // ASDF(失败,目前合格)
  • 试验5 - > /asd/ads/c.csv/(应该传递)
  • 测试6 - > asd/asfd/a(应该失败)

建议如何解决这个问题?

回答

1

路径//asdf在LINUX,UNIX,iOS和Android上有效,因此您的代码已可用。但是,如果由于某种原因使特定的一组有效路径无效很重要,只需在[a-z ...]字符组之后用加号代替星号即可。这将导致无间隔字符的多路径分隔符无效。

用正则表达式方法和细节来评论更大的问题可能很有用。

1)您可以使用[\ /]代替(\ | /),但两者都会允许在操作系统和文件系统的每个组合上出现误报。 (那些需要正斜杠的应该排除反斜杠作为分隔符,反之亦然。)

2)字符范围[a-zA-Z0-9 \ s -_ \ @ - \ ^!#$%&] in问题不在于操作系统和文件系统的任何已知组合的目录路径元素的允许字符范围。例如,对于大多数目录名称,句点是有效的。

3)允许的字符范围不可移植。 (测试路径验证的最可靠方法是触摸实际文件系统上的文件名,意思是实例化一个空文件并捕获实例化失败的任何迹象。)

4)您不需要或不需要星号之后或第二个(\ | /)组后面的问号。他们不会创建错误,但是他们会浪费编译或运行时间,并且会混淆正则表达式的用途。

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))

0

尝试使用/^(\/|([\\/][\w\[email protected]^!#$%&-]+)+(\.[a-z]+[\\/]?)?)$/i代替,这迫使至少一个字符的每个之间匹配斜线:

var regex = /^(\/|([\\/][\w\[email protected]^!#$%&-]+)+(\.[a-z]+[\\/]?)?)$/i 
 

 
console.log([ 
 
    '/', 
 
    '/asdf', 
 
    '/asdf/scd.csv', 
 
    '//asdf', 
 
    '/asd/ads/c.csv/', 
 
    'asd/asfd/a' 
 
].map(RegExp.prototype.test, regex))

0
((\/[\w\s\[email protected]^!#$%&-]+)+\/?)|\/[\w\.\[email protected]^!#$%&-]* 

这被测试以匹配你的样本输入,在np ++上(即,在np ++上)与
但是匹配。 perl-regex味道),因为我没有使用JavaScript的经验。
因此,在这里风味独立散文相同。

“(斜线和字符多次,随后可选的斜线)

斜线和零个或多个字符”。

注1:我添加了明确的“。”。允许的字符。注2:我假设你的“\ /”意思是“明确的斜杠,而不是反斜杠”。

相关问题