将正则表达式匹配包含在分隔的字符串中

时间:2017-10-16 14:36:20

标签: c# regex

我试图解析从已经启动的进程中读取的命令行选项。原始字符串看起来像那个 -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数组中?

Regex101

2 个答案:

答案 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

请注意,第一组捕获每个选项,但是您必须修剪它,因为它保留了以下一个用于分隔选项的空格。这是保持周围报价的最好方法。