0

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

我如何负担得起反之亦然的表达方式?

4

1 回答 1

1

我可以帮助您进行目录匹配。

让我们从可以为目录添加前缀的方式开始。

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

让我们将表达式包装在空格(可能不止一个)中以确保安全。[ ]+

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

这应该匹配带有空格的路径,只要它们用引号引起来。这是我使用它进行的一些试验

至于没有引号的没有空格的路径,试试这个正则表达式。

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

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

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

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

祝你好运!

于 2016-06-29T16:51:56.217 回答