javascript中的文件路径验证

时间:2013-04-26 07:43:48

标签: javascript regex validation

我正在尝试在javascript中验证XML文件路径。我的REGEX是:

var isValid = /^([a-zA-Z]:)?(\\{2}|\/)?([a-zA-Z0-9\\s_@-^!#$%&+={}\[\]]+(\\{2}|\/)?)+(\.xml+)?$/.test(str);

即使路径错误,它也会返回true。 这些是有效路径

D:/test.xml
D:\\folder\\test.xml
D:/folder/test.xml
D:\\folder/test.xml
D:\\test.xml

3 个答案:

答案 0 :(得分:4)

首先是明显的错误:

+是一个重复指标,其含义至少为一个 因此,(\.xml+)将匹配以.xm开头,后跟一个或多个l(它也匹配.xmlllll)的所有内容。 ?表示可选,因此(\.xml+)?具有.xml的含义,但不是必需的。

同样适用于([a-zA-Z]:)?这意味着驱动程序字母是可选的。

现在出现不那么明显的错误

[a-zA-Z0-9\\s_@-^!#$%&+={}\[\]]在此定义允许的字符列表。您有\\s并且我假设您要允许空格,但这允许\s,因此您需要将其更改为\s。那么你有这个部分@-^我假设你想允许@-^,但-[中有特殊含义} ]用它来定义一个范围,这样你就可以允许@^范围内的所有字符,如果你想允许-你需要在那里转义它所以你必须写@\-^你需要注意^,如果它在[之后它也会有特殊意义。

您的正则表达式应包含以下部分:

  • ^[a-z]:以(^)司机信件
  • 开头
  • ((\\|\/)[a-z0-9\s_@\-^!#$%&+={}\[\]]+)+后跟一个或多个路径部分,这些路径部分以\/开头,路径名称包含一个或多个已定义的字母(a-z0-9\s_@\-^!#$%&+={}\[\]
  • \.xml$以($.xml
  • 结尾
因此,你的最终正则表达应该如下所示 /^[a-z]:((\\|\/)[a-z0-9\s_@\-^!#$%&+={}\[\]]+)+\.xml$/i.test(str)
(假设您使用i标志执行不区分大小写的正则表达式)

编辑:

var path1 = "D:/test.xml";               // D:/test.xml
var path2 = "D:\\folder\\test.xml";      // D:\folder\test.xml
var path3 = "D:/folder/test.xml";        // D:/folder/test.xml
var path4 = "D:\\folder/test.xml";       // D:\folder/test.xml
var path5 = "D:\\test.xml";              // D:\test.xml

console.log( /^[a-z]:((\\|\/)[a-z0-9\s_@\-^!#$%&+={}\[\]]+)+\.xml$/i.test(path1) );
console.log( /^[a-z]:((\\|\/)[a-z0-9\s_@\-^!#$%&+={}\[\]]+)+\.xml$/i.test(path2) );
console.log( /^[a-z]:((\\|\/)[a-z0-9\s_@\-^!#$%&+={}\[\]]+)+\.xml$/i.test(path3) );
console.log( /^[a-z]:((\\|\/)[a-z0-9\s_@\-^!#$%&+={}\[\]]+)+\.xml$/i.test(path4) );
console.log( /^[a-z]:((\\|\/)[a-z0-9\s_@\-^!#$%&+={}\[\]]+)+\.xml$/i.test(path5) );

<强>更新

如果您需要转义它们,则需要注意/\取决于您是否将其与new RegExp(' ... the regex ... ',"i")new RegExp(" ... the regex ... ","i")一起使用或/ ... the regex ... /i 1}}

有关正则表达式的更多信息,您应该查看例如www.regular-expressions.info

答案 1 :(得分:0)

这可能会对你有用

var str = 'D:/test.xml';
var str2 = 'D:\\folder\\test.xml';
var str3 = 'D:/folder/test.xml';
var str4 = 'D:\\folder/test.xml';
var str5 = 'D:\\test\\test\\test\\test.xml';

var regex = new RegExp('^[a-z]:((\\\\|\/)[a-zA-Z0-9_ \-]+)+\.xml$', 'i'); 
regex.test(str5);

让RegExp中的\\\\与字符串中的\\匹配的原因是javascript使用\来转义特殊字符,即新行\n { {1}}用于字边界等。因此,要使用文字\b,请使用\。它还允许您对文件名和文件夹名称使用不同的规则。

更新

\\ regexp的这一部分实际上匹配文件/文件夹名称。因此,要在文件/文件夹名称中添加更多字符,只需将它们添加到此类,例如,允许文件/文件夹名称中的[a-zA-Z0-9_\-]+使其成为*

更新2

为了添加答案,以下是一个RegExp,它为验证添加了另一个检查,即它检查路径中[a-zA-Z0-9_\-\*]+/的混合。

\\

var str6 = 'D:/This is folder/test @ file.xml'; var str7 = 'D:/This is invalid\\path.xml' var regex2 = new RegExp('^[a-z]:(\/|\\\\)([a-zA-Z0-9_ \-]+\\1)*[a-zA-Z0-9_ @\-]+\.xml?', 'gi'); 将匹配除regex2

之外的所有路径

更新

对于在str7中错误输入?而不是$,我表示道歉。以下是更正后的预期版本

regex2

答案 2 :(得分:0)

使用Scratchpad进行测试。

var regex = /^[a-z]:((\/|(\\?))[\w .]+)+\.xml$/i;

在Web控制台中打印true :(在Firefox上按Ctrl + Shift + K)

console.log(regex.test("D:/test.xml"));
console.log(regex.test("D:\\folder\\test.xml"));
console.log(regex.test("D:/folder/test.xml"));
console.log(regex.test("D:\\folder/test.xml"));
console.log(regex.test("D:\\test.xml"));
console.log(regex.test("D:\\te st_1.3.xml")); // spaces, dots allowed

或者,使用警告框:

alert(regex.test("D:/test.xml"));
alert(regex.test("D:\\folder\\test.xml"));
alert(regex.test("D:/folder/test.xml"));
alert(regex.test("D:\\folder/test.xml"));
alert(regex.test("D:\\test.xml"));
alert(regex.test("D:\\te st_1.3.xml"));

文件路径无效:

alert(regex.test("AD:/test.xml")); // invalid drive letter
alert(regex.test("D:\\\folder\\test.xml")); // three backslashes
alert(regex.test("/folder/test.xml")); // drive letter missing
alert(regex.test("D:\\folder/test.xmlfile")); // invalid extension