Muh*_*riq 4 javascript regex validation
我正在尝试在 javascript 中验证 XML 文件路径。我的正则表达式是:
var isValid = /^([a-zA-Z]:)?(\\{2}|\/)?([a-zA-Z0-9\\s_@-^!#$%&+={}\[\]]+(\\{2}|\/)?)+(\.xml+)?$/.test(str);
Run Code Online (Sandbox Code Playgroud)
即使路径错误,它也会返回 true。这些是有效的路径
D:/test.xml
D:\\folder\\test.xml
D:/folder/test.xml
D:\\folder/test.xml
D:\\test.xml
Run Code Online (Sandbox Code Playgroud)
起初明显的错误:
+是具有至少一个含义的重复指示符。
所以(\.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) );
Run Code Online (Sandbox Code Playgroud)
更新:
你需要照顾/和\如果你需要逃避他们取决于你是否使用它new RegExp(' ... the regex ... ',"i")和new RegExp(" ... the regex ... ","i")或/ ... the regex ... /i
有关正则表达式的更多信息,您应该查看例如www.regular-expressions.info