作者:mobiledu2502852915 | 来源:互联网 | 2022-12-09 18:17
我试图找到Java脚本的Windows文件路径验证,但似乎没有一个可以满足我想要的要求,因此我决定自己构建它。
要求如下:
路径不能为空
可以以x:\,x:\\,\,//开头,然后是文件名(无需文件扩展名)
文件名不能包含以下特殊字符:<>:“ |?*
文件名不能以点或空格结尾
这是我想出的正则表达式:
/ ^([az]:((\ | / | \\\ ///))|(\\ | //))[^ <>:“ |?*] + /一世
但是有一些问题:
它还会验证包含规则中提到的特殊字符的文件名
它不包含最后一条规则(不能以。或空格结尾)
var reg = new RegExp(/^([a-z]:((\\|\/|\\\\|\/\/))|(\\\\|\/\/))[^<>:"|?*]+/i);
var startList = [
'C://test',
'C://te?st.html',
'C:/test',
'C://test.html',
'C://test/hello.html',
'C:/test/hello.html',
'//test',
'/test',
'//test.html',
'//10.1.1.107',
'//10.1.1.107/test.html',
'//10.1.1.107/test/hello.html',
'//10.1.1.107/test/hello',
'//test/hello.txt',
'/test/html',
'/tes?t/html',
'/test.html',
'test.html',
'//',
'/',
'\\\\',
'\\',
'/t!esrtr',
'C:/hel**o'
];
startList.forEach(item => {
document.write(reg.test(item) + ' >>> ' + item);
document.write("
");
});
Valdi_Bo..
5
不幸的是,Javascript风格的正则表达式不支持先行式,但幸运的是它支持先行,这是构造正则表达式的关键因素。
让我们从一些观察开始:
在点,斜杠,反斜杠或空格之后,不能再出现另一个点,斜杠或反斜杠。该“禁止”字符集还包括
\n
,因为这些字符都不是文件名或其段(点之间或(反)斜杠之间)的最后一个字符。
路径中允许的其他字符是您提到的字符(...除外),但是“排除列表”中还必须包括点,斜杠,反斜杠,空格和\n
(第1点中提到的字符)。
在“初始部分”(C:\)之后,可以在点1或2中提到多个char实例。
考虑到这些要点,我从三个部分构建了正则表达式:
“开始”部分,匹配驱动器号,冒号和最多2个斜杠(向前或向后)。
第一个替代方法-点,斜杠,反斜杠或带负前瞻性的空格-在上述每个字符之后列出“禁止”字符(请参见第1点)。
第二种选择-第2点提到的字符。
以上两种选择都可以多次出现(+
量词)。
因此正则表达式如下:
^
-字符串的开头。
(?:[a-z]:)?
-驱动器号和冒号(可选)。
[\/\\]{0,2}
-反斜杠或斜杠,介于0到2次之间。
(?:
-非捕获组的开始,由于+
后面有量化符而需要。
[.\/\\ ]
-第一种选择。
(?![.\/\\\n])
-负前瞻-“禁止”字符。
|
- 要么。
[^<>:"|?*.\/\\ \n]
-第二种选择。
)+
-非捕获组的结尾可能会出现多次。
$
-字符串的结尾。
如果尝试分别匹配每个路径,请仅使用i
选项。
但是,如果您在单独的行中有多个路径,并一次性进行全局匹配,则还要添加g
和m
选项。
有关工作示例,请参见https://regex101.com/r/4JY31I/1
注意:我想也!
应该将其视为禁止字符。如果您同意,则将其添加到第二个替代方法中,例如在之后*
。
1> Valdi_Bo..:
不幸的是,Javascript风格的正则表达式不支持先行式,但幸运的是它支持先行,这是构造正则表达式的关键因素。
让我们从一些观察开始:
在点,斜杠,反斜杠或空格之后,不能再出现另一个点,斜杠或反斜杠。该“禁止”字符集还包括
\n
,因为这些字符都不是文件名或其段(点之间或(反)斜杠之间)的最后一个字符。
路径中允许的其他字符是您提到的字符(...除外),但是“排除列表”中还必须包括点,斜杠,反斜杠,空格和\n
(第1点中提到的字符)。
在“初始部分”(C:\)之后,可以在点1或2中提到多个char实例。
考虑到这些要点,我从三个部分构建了正则表达式:
“开始”部分,匹配驱动器号,冒号和最多2个斜杠(向前或向后)。
第一个替代方法-点,斜杠,反斜杠或带负前瞻性的空格-在上述每个字符之后列出“禁止”字符(请参见第1点)。
第二种选择-第2点提到的字符。
以上两种选择都可以多次出现(+
量词)。
因此正则表达式如下:
^
-字符串的开头。
(?:[a-z]:)?
-驱动器号和冒号(可选)。
[\/\\]{0,2}
-反斜杠或斜杠,介于0到2次之间。
(?:
-非捕获组的开始,由于+
后面有量化符而需要。
[.\/\\ ]
-第一种选择。
(?![.\/\\\n])
-负前瞻-“禁止”字符。
|
- 要么。
[^<>:"|?*.\/\\ \n]
-第二种选择。
)+
-非捕获组的结尾可能会出现多次。
$
-字符串的结尾。
如果尝试分别匹配每个路径,请仅使用i
选项。
但是,如果您在单独的行中有多个路径,并一次性进行全局匹配,则还要添加g
和m
选项。
有关工作示例,请参见https://regex101.com/r/4JY31I/1
注意:我想也!
应该将其视为禁止字符。如果您同意,则将其添加到第二个替代方法中,例如在之后*
。