【问题标题】:How to build a command parser with regex如何使用正则表达式构建命令解析器
【发布时间】: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”,程序也可以输出预期的结果。

  1. 是否可以使用正则表达式解决问题?
  2. 如果正则表达式无能为力,还有其他建议吗?

感谢您的任何建议、编辑和查看。

【问题讨论】:

  • 我实际上不会为此使用正则表达式,我认为简单的 args foreach 就足够了。

标签: c# regex command-line-arguments


【解决方案1】:

只需执行string.split('_') 然后遍历数组以找到您需要的一切。

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

等等。

【讨论】:

  • 我不得不说你是对的,现在我正在使用类似的方式来处理它,谢谢@woutervs。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
相关资源
最近更新 更多