【问题标题】:File path validation in javascriptjavascript中的文件路径验证
【发布时间】:2013-04-20 07:39:39
【问题描述】:

我正在尝试在 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

【问题讨论】:

  • 如果您说哪个路径不应该是有效的会很有帮助。我认为它应该始终以 xml 文件结尾。但是D:/ 是必需的吗?或者也是以/ valid 开头的路径?
  • 可以是任何字符而不是D。但它应该以.xml结尾
  • 抱歉不清楚。驱动程序字母是有效路径还是 /folder/test.xml 也有效?
  • 是的,驱动器号是必需的。

标签: javascript regex validation


【解决方案1】:

起初明显的错误:

+ 是一个重复指示符,其含义至少为一个。
因此(\.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 一起使用

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

【讨论】:

  • 更新这条路径的正则表达式。 var path4 = "D:\folder\folder/test.xml";
  • @ImranTariq "D:\folder\folder/test.xml" is not D:\folder\folder/test.xml \f is like \n or \r a special char ...检查console.log("\f".length)的长度为1且不是@ 987654372@ + f
  • 我的意思是路径可能包含一个反斜杠 \ 即 D:\folder\folder/test.xml
  • @ImranTariq 一个反斜杠:"D:\\name.xml" 两个反斜杠:"D:\\\\name.xml" 没有反斜杠,而是一个换行符 (\n):"D:\name.xml"。 (你需要用反斜杠转义字符串中的反斜杠!)
  • 如果文件夹名称包含点,则正则表达式会失败。固定正则表达式/^[a-z]:((\\|\/)[a-z0-9\s_@\-^!.#$%&+={}\[\]]+)+\.xml$/i
【解决方案2】:

这可能对你有用

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);

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

更新

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

更新 2

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

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 中错误输入 ? 而不是 $ 深表歉意。以下是更正和预期的版本

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

【讨论】:

  • 这也验证 'D:/testxml' 即 xml 之前没有点
【解决方案3】:

使用 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

【讨论】:

  • @ImranTariq 使用 JavaScript 样式不区分大小写的标志重写了正则表达式。
  • 您输入的是一个文件路径还是一堆文件都在一个新行上?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 2011-12-08
  • 1970-01-01
相关资源
最近更新 更多