简体   繁体   中英

How to build a command parser with regex

I'm trying to implement a command parser to parse command parameters to a key value pair list. For example, there is a command to output images: [name]_w[width]_h[height]_t[transparency] ,say"image01_w64_h128_t90",the program would output the image "image01" with specified size and transparency, and so far I'm using regex to solve it.

Code:

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;
}

This way worked and the code is very easy. However, a higher demand is if the order of parameters is changed, say "image01_h128_w64_t90" or "image01_t90_w64_h128", the program can also output expected result.

  1. Is it possible to solve the problem using regex?
  2. If regex is helpless,any other suggestions?

Thanks for any suggestion, editing, and viewing.

Just do string.split('_') then iterate through the array to find everything you need.

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

and so on.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM