是否可以在一行中检测捕获组的组合和排列?
Is it possible to detect combinations and permutations of captured groups in a single line?
我正在尝试从进程 table 中检测程序,我需要在捕获的组中解析它的参数。我想用一个正则表达式来做到这一点,但是,我不知道如果一些参数混乱 and/or 是否可以省略。
例如,我有:
program.exe -a arg_a -b arg_b -c arg_c -d arg_d -e arg_e
但也可以是:
program.exe -c arg_c -a arg_a -b arg_b -e arg_e
program.exe -b arg_b
program.exe -a arg_a -c arg_c -d arg_d
现在,我需要获取每个参数。我知道我可以简单地使用如下所示的 5 组正则表达式,
"program.exe(?:.*-a (?<arga>\w+)|)"
"program.exe(?:.*-b (?<argb>\w+)|)"
"program.exe(?:.*-c (?<argc>\w+)|)"
"program.exe(?:.*-d (?<argd>\w+)|)"
"program.exe(?:.*-e (?<arge>\w+)|)"
但这需要 5 次迭代,我真的很想一次性完成 运行。
可能吗?非常感谢对此的任何见解。
当然,让你的正则表达式像
-(?<arg>[a-e]) (?<val>\w+)
运行 它,你会得到 n 个匹配项,其中 n 是参数的数量,然后你可以循环它们
如果您将它们分配给字典并拥有读取字典的道具,则提供它们的顺序无关紧要
foreach(var m in r.Matches(...))
args[m.Groups["arg"].Value] = m.Groups["val"].Value;
(也可以为该位使用 LINQ..)
然后是一些道具,例如:
public string ArgumentE { get => args.TryGetValue("e", out string s) ? s ; "default"; }
所以你的代码可以
if(ArgumentE == "White")
...
您可以使用这样的正则表达式来匹配整个字符串:
^program.exe(?:\s+-(?<name>[a-e]) (?<arg>\w+))+$
然后利用 Captures
属性:
string regex = @"^program.exe(?:\s+-(?<name>[a-e]) (?<arg>\w+))+$";
string text = "program.exe -a arg_a -d arg_d -e arg_e -b arg_b -c arg_c";
Match match = Regex.Match(text, regex);
var names = match.Groups["name"];
var args = match.Groups["arg"];
foreach (var (name, arg) in names.Captures.Zip(args.Captures)) {
Console.WriteLine($"{name.Value}: {arg.Value}");
// or add these pairs to a dictionary for further processing and validation
}
/*
a: arg_a
d: arg_d
e: arg_e
b: arg_b
c: arg_c
*/
我正在尝试从进程 table 中检测程序,我需要在捕获的组中解析它的参数。我想用一个正则表达式来做到这一点,但是,我不知道如果一些参数混乱 and/or 是否可以省略。
例如,我有:
program.exe -a arg_a -b arg_b -c arg_c -d arg_d -e arg_e
但也可以是:
program.exe -c arg_c -a arg_a -b arg_b -e arg_e
program.exe -b arg_b
program.exe -a arg_a -c arg_c -d arg_d
现在,我需要获取每个参数。我知道我可以简单地使用如下所示的 5 组正则表达式,
"program.exe(?:.*-a (?<arga>\w+)|)"
"program.exe(?:.*-b (?<argb>\w+)|)"
"program.exe(?:.*-c (?<argc>\w+)|)"
"program.exe(?:.*-d (?<argd>\w+)|)"
"program.exe(?:.*-e (?<arge>\w+)|)"
但这需要 5 次迭代,我真的很想一次性完成 运行。
可能吗?非常感谢对此的任何见解。
当然,让你的正则表达式像
-(?<arg>[a-e]) (?<val>\w+)
运行 它,你会得到 n 个匹配项,其中 n 是参数的数量,然后你可以循环它们
如果您将它们分配给字典并拥有读取字典的道具,则提供它们的顺序无关紧要
foreach(var m in r.Matches(...))
args[m.Groups["arg"].Value] = m.Groups["val"].Value;
(也可以为该位使用 LINQ..)
然后是一些道具,例如:
public string ArgumentE { get => args.TryGetValue("e", out string s) ? s ; "default"; }
所以你的代码可以
if(ArgumentE == "White")
...
您可以使用这样的正则表达式来匹配整个字符串:
^program.exe(?:\s+-(?<name>[a-e]) (?<arg>\w+))+$
然后利用 Captures
属性:
string regex = @"^program.exe(?:\s+-(?<name>[a-e]) (?<arg>\w+))+$";
string text = "program.exe -a arg_a -d arg_d -e arg_e -b arg_b -c arg_c";
Match match = Regex.Match(text, regex);
var names = match.Groups["name"];
var args = match.Groups["arg"];
foreach (var (name, arg) in names.Captures.Zip(args.Captures)) {
Console.WriteLine($"{name.Value}: {arg.Value}");
// or add these pairs to a dictionary for further processing and validation
}
/*
a: arg_a
d: arg_d
e: arg_e
b: arg_b
c: arg_c
*/