C# 正则表达式:检查 net use 命令中的给定目录是否包含空格

C# Regex: Check if the given directory in a net use command contains whitespaces

我正在编写一个工具来标准化批处理文件,我使用正则表达式来验证其中的每个 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

为了安全起见,让我们用空格(可能不止一个)包裹表达式。 [ ]+

[ ]+"(\.\/|\.\.\/|\/)?[^\/"]++(\/[^\/"]++)+"[ ]+

这应该匹配带空格的路径,只要它们用引号引起来。 Here are some trials that I ran with it.

至于没有空格且未包含在引号中的路径,请尝试使用此正则表达式。

[ ]+(\.\/|\.\.\/|\/)?[^\/\s]++(\/[^\/\s]++)+[ ]+

它与其他正则表达式共享功能,因此希望您可以将其用作理解此正则表达式的参考点。我不确定这对您的问题有多大帮助,但我想它应该对路径部分有所帮助。

哦,要结合使用它们,只需您的正则表达式 or 运算符 |。应该看起来像这样:

(                                                # begin capturing group
[ ]+"(\.\/|\.\.\/|\/)?[^\/"]++(\/[^\/"]++)+"[ ]+ # paths with spaces
|                                                # or
[ ]+(\.\/|\.\.\/|\/)?[^\/\s]++(\/[^\/\s]++)+[ ]+ # paths w/o spaces
)                                                # end capturing group

祝你好运!