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.'-,!+]+)*))

我如何让表达式反过来做呢?

c# Regex:检查net use命令中的给定目录是否包含空白

我可以帮你进行目录匹配。

让我们从目录的前缀开始。

./例如./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

祝你好运!