c# - 是否可以在一行中检测捕获组的组合和排列?
问题描述
我试图从进程表中检测一个程序,我需要在捕获的组中解析它的参数。我想用一个正则表达式来做到这一点,但是,我不知道是否有可能某些参数被混淆和/或省略。
例如,我有:
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 次迭代,我真的很想一次运行。
是否可以?非常感谢对此的任何见解。
解决方案
您可以使用这样的正则表达式来匹配整个字符串:
^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
*/
推荐阅读
- rxjs - BehaviorSubject 是否与 shareReplay(1) 相同?
- python - Docker Run [tag-name to container] 返回 python: can't open file in Windows
- python - (Python/Selenium) 字典缺少元素
- jpa - JPA 继承:查询因未知列而失败
- html - 我链接了 boostrap.css 和 boostrap.min.css 但样式不起作用
- django - Django Admin,使用完全相同的外键限制多对多选择
- android - 如何在 ktlint 中禁用文件名?
- javascript - 如何动态调用componentDidMount中的函数?
- python - 调用路由时,Flask 正在从不同的路径加载静态文件
- javascript - 在终端中使用 wkhtmltopdf 测试时 Javascript 不起作用