我试图解析从已经启动的进程中读取的命令行选项。原始字符串看起来像那个
-skipIntro -noSplash -cpuCount=7 -exThreads=7 -enableHT -malloc=tbb4malloc_bi_x64 -hugePages -maxmem=4096 -maxvram=2048 -world=empty -showScriptErrors -mod=
单个参数可以有四种不同的格式
-skipIntro
"-skipIntro"
-mod=foo
"-mod=foo"
或"-mod=b ar"
转义参数可以包含空格
我想将所有参数拆分为一个字符串数组。拆分参数应分别包含前缀-
"-
。
我的正则表达式如下:
\s*[\"]*?-
工作正常。但是,这也删除了上面提到的前缀。如何将前缀包含在分隔的params数组中?
答案 0 :(得分:1)
我有一个不拆分字符串的解决方案。相反,它返回匹配。
(?<=^|\s)"-.*?"|-[^\s]*?(?=$|\s)
说明:
使用与前缀和后缀之间的位置匹配的一般模式(?<=prefix)find(?=suffix)
。其中
前缀是:^|\s
字符串或空格字符的开头
后缀是:$|\s
字符串或空格字符的结尾。
查找:"-.*?"|-[^\s]*?
找到"-
,后跟任何字符,然后是"
OR
-
,后面跟空格字符以外的任何字符
这两个变体的字符尽可能少(由?
表示)。
string pattern = @"(?<=^|\s)""-.*?""|-[^\s]*?(?=$|\s)";
string input = "-skipIntro \"-skipIntro\" -noSplash \"-mod=foo\" \"-mod=b ar\" -cpuCount=7";
MatchCollection matches = Regex.Matches(input, pattern);
foreach (Match match in matches) {
Console.WriteLine(match.Value);
}
请注意,在逐字字符串@"..."
中,双引号"
通过将它们加倍来估算。
答案 1 :(得分:0)
这个正则表达式会对你想要实现的目标起作用吗?
((\")?-.*?(?(2)\"|(\s|$)))
Here's a fork of your Regex101
请注意,第一组捕获每个选项,但是您必须修剪它,因为它保留了以下一个用于分隔选项的空格。这是保持周围报价的最好方法。