4

我正在尝试在 javascript 中验证 XML 文件路径。我的正则表达式是:

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
4

3 回答 3

6

起初明显的错误:

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

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

现在不那么明显的错误

[a-zA-Z0-9\\s_@-^!#$%&+={}\[\]]在这里,您定义了一个允许的字符列表。你有\\s,我假设你想允许空格,但这允许\s所以你需要将它更改为\s. 那么你有这部分@-^我假设你想要允许@,但是在它-里面有一个特殊的含义 你定义了一个范围,所以你允许所有在 to范围内的字符, 如果你想允许你需要在那里转义它所以你要写你也需要注意,如果是紧跟在后面的话,它也有特殊的意义。^-[ ]@^-@\-^^[

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

  • ^[a-z]:以 ( ^) 驱动程序字母开头
  • ((\\|\/)[a-z0-9\s_@\-^!#$%&+={}\[\]]+)+后跟一个或多个以任一开头的路径部分\or开头的路径部分,/路径名称包含一个或多个您定义的字母 ( 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")and一起使用new RegExp(" ... the regex ... ","i")或 with 一起使用/ ... the regex ... /i

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

于 2013-04-26T08:30:35.050 回答
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
于 2013-04-26T08:17:50.843 回答
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);

使用\\\\in RegExp 匹配\\字符串中的原因是 javascript 用于\转义特殊字符,即\n换行符、\b单词边界等。所以要使用文字\,请使用\\. 它还允许您对文件名和文件夹名有不同的规则。

更新

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

更新 2

为了增加答案,下面是一个正则表达式,它为验证添加了另一个检查,即它检查路径 中的/和的混合。\\

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

更新

我很抱歉输入错误 a?而不是$in regex2。以下是更正和预期的版本

var regex2 = new RegExp('^[a-z]:(\/|\\\\)([a-zA-Z0-9_ \-]+\\1)*[a-zA-Z0-9_ @\-]+\.xml$', 'i');
于 2013-04-26T08:04:37.650 回答