c# Regex:检查net use命令中的给定目录是否包含空白
本文关键字:是否 空白 包含 Regex 检查 net 命令 use | 更新日期: 2023-09-27 17:53:03
我正在编写一个工具来标准化批处理文件,我使用正则表达式来验证其中的每个net use
命令。
我被困在给定给命令的目录中。本例中该命令的标准语法为:net use [devicename]: [path] [/user:"'domain'user"] [password] [/persistent:no]
,其中[path]
可以包含空白。如果 true
必须在引号("
)之间,否则必须没有引号。用户名和密码可选。路径可以包含以下特殊字符(!
、,
、+
、.
、-
)。
下面的正则表达式允许有引号的路径不带空白,而不允许有引号的排序的空白或不带空白和引号的。正则表达式可能包含语法错误,我在regex101.com上用PCRE进行了测试:
Regex pattern = new Regex(@"^net use [a-z]:'s
(?(?=['S]+'s['S]+)(""''''['w.'-,!+]+('s['w.'-,!+]+)*(''['w.'-,!+]+('s['w.'-,!+]+)*)*"")|
(''''['w.'-,!+]+(''['w.'-,!+]+)*))
('s'/user:""[a-zA-Z0-9]+(''[a-zA-Z0-9]+)*"")?'s'/persistent:no$");
正则表达式的必要部分是:
(?(?=['S]+'s['S]+)(""''''['w.'-,!+]+('s['w.'-,!+]+)*(''['w.'-,!+]+('s['w.'-,!+]+)*)*"")|
(''''['w.'-,!+]+(''['w.'-,!+]+)*))
我如何让表达式反过来做呢?
我可以帮你进行目录匹配。
让我们从目录的前缀开始。
./
例如./some/path/to/some/file.txt
../
例../some/path/to/some/file.txt
/
例/some/path/to/some/file.txt
<blank>
例some/path/to/some/file.txt
我们可以用这个正则表达式来描述。
('.'/|'.'.'/|'/)?
绝对不美观,但它工作。
这是我们的正则表达式在浓缩成一行代码之前的扩展图。
" # opening quotation mark
('.'/|'.'.'/|'/)? # optional / ./ ../
[^'/"]++ # match content after opening / ./ ../
('/[^'/"]++)+ # match /<CONTENT> repetitively
" # closing quotation mark
为了安全起见,我们把表达式用空格(可能不止一个)括起来。[ ]+
[ ]+"('.'/|'.'.'/|'/)?[^'/"]++('/[^'/"]++)+"[ ]+
应该匹配带有空格的路径,只要它们被引号括起来。以下是我用它进行的一些试验。
对于没有空格且没有引号的路径,可以试试这个regex。
[ ]+('.'/|'.'.'/|'/)?[^'/'s]++('/[^'/'s]++)+[ ]+
它与另一个正则表达式共享特性,因此希望您可以将其作为理解此正则表达式的参考点。我不确定这对你的问题有多大帮助,但我想它应该对路径部分有一点帮助。
哦,要将它们结合使用,只需使用regex or
运算符|
。应该看起来像这样:
( # begin capturing group
[ ]+"('.'/|'.'.'/|'/)?[^'/"]++('/[^'/"]++)+"[ ]+ # paths with spaces
| # or
[ ]+('.'/|'.'.'/|'/)?[^'/'s]++('/[^'/'s]++)+[ ]+ # paths w/o spaces
) # end capturing group
祝你好运!