如何使用正则表达式构建命令解析器

时间:2013-12-17 09:42:19

标签: c# regex command-line-arguments

我正在尝试实现一个命令解析器来将命令参数解析为键值对列表。 例如,有一个输出图像的命令:[name]_w[width]_h[height]_t[transparency],比如“image01_w64_h128_t90”,程序将输出具有指定大小和透明度的图像“image01”,到目前为止我正在使用正则表达式来解决它。 / p>

代码:

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”,程序也可以输出预期的结果。

  1. 是否可以使用正则表达式来解决问题?
  2. 如果正则表达式无奈,还有其他任何建议吗?
  3. 感谢您提出建议,编辑和查看。

1 个答案:

答案 0 :(得分:0)

只需执行string.split('_')然后遍历数组即可找到所需的一切。

if(arr[i].startswith("w"))
{
paramList["width"] = arr[i].remove(0,1);
}

等等。