【发布时间】:2013-12-17 18:03:25
【问题描述】:
我正在尝试实现一个命令解析器来将命令参数解析为一个键值对列表。
比如有一个输出图片的命令:[name]_w[width]_h[height]_t[transparency],say"image01_w64_h128_t90",程序会输出指定大小和透明度的图片"image01",目前我使用的是正则表达式解决。
代码:
private static readonly Regex CommandReg = new Regex(
@"^(?<name>[\d\w]+?)(_W(?<width>\d+))?(_H(?<height>\d+))?(_T(?<transparency>\d+))?$"
, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.ExplicitCapture);
public static NameValueCollection ParseCommand(string command)
{
var match = CommandReg.Match(command);
if (!match.Success) return null;
var groups = match.Groups;
var paramList = new NameValueCollection(4);
paramList["name"] = groups["name"].Value;
paramList["width"] = groups["width"].Value;
paramList["height"] = groups["height"].Value;
paramList["transparency"] = groups["transparency"].Value;
return paramList;
}
这种方法很有效,代码也很简单。但是,更高的要求是如果参数的顺序改变,比如“image01_h128_w64_t90”或者“image01_t90_w64_h128”,程序也可以输出预期的结果。
- 是否可以使用正则表达式解决问题?
- 如果正则表达式无能为力,还有其他建议吗?
感谢您的任何建议、编辑和查看。
【问题讨论】:
-
我实际上不会为此使用正则表达式,我认为简单的 args foreach 就足够了。
标签: c# regex command-line-arguments