路径//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))