我正在尝试在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
答案 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_\-]+
使其成为*
为了添加答案,以下是一个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