C#Regex请求“参数”并返回命令行解析

时间:2018-01-12 13:25:27

标签: c# regex

是否可以为解析命令行请求创建Regex模式?

赞:something text -PARAMETER="Hello world" something else.. -PARAMETER=HelloWorld

我想要-PARAMETER并获得两项"Hello world"(或仅Hello world)和第二次HelloWorld

由于

编辑: 抱歉有一个严峻的问题。我的问题是什么是正则表达式的最佳方法或更好地解决这个问题。 在正则表达式中我使用了这种模式:-PARAMETER=".*"|-PARAMETER=.*?\s,但我的意思是可以更好。 一种可能的方法:

string command = "PARAMETER";
string pattern = $"-{command}= \".*\" | -{command}=.*?\\s";
foreach (Match _m in Regex.Matches(CommandBlockArgs, pattern, RegexOptions.IgnoreCase))
{
  Console.WriteLine(_m.Value.Replace($"-{command}=", "").Replace("\"", "").Trim());
}
// *sorry for possible error, I wrote code now by head.*

但是,我的意思是这不是一个好的解决方案。

例如,对我来说,引号用parse命令的好方法是:

[DllImport("shell32.dll", SetLastError = true)]
static extern IntPtr CommandLineToArgvW(
[MarshalAs(UnmanagedType.LPWStr)] string lpCmdLine, out int pNumArgs);

public static string[] CommandLineToArgs(string commandLine)
{
  int argc;
  var argv = CommandLineToArgvW(commandLine, out argc);
  if (argv == IntPtr.Zero)
    throw new System.ComponentModel.Win32Exception();
    try
    {
      var args = new string[argc];
      for (var i = 0; i < args.Length; i++)
      {
        var p = Marshal.ReadIntPtr(argv, i * IntPtr.Size);
        args[i] = Marshal.PtrToStringUni(p);
      }
      return args;
    }
    finally
    {
      Marshal.FreeHGlobal(argv);
    }
 }

但这不是我的命令列表。而且Regex可以更好......还是组合?

*抱歉英语=)

1 个答案:

答案 0 :(得分:0)

所以,我的解决方案(C#5.0):

    internal static object CallMethod(Type type, string method, string parameters)
    {
        MethodInfo m = type.GetMethod(method, BindingFlags.Static | BindingFlags.Public);
        ParameterInfo[] p = m.GetParameters();
        object[] param = new object[p.Count()];
        UInt16 i = 0;
        foreach (ParameterInfo pi in p)
        {
            string pattern = $"-{pi.Name}=\".*\"|-{pi.Name}=.*?\\s"; // -paramName=paramValue || -paramName="param Value"
            foreach (Match _m in Regex.Matches(parameters, pattern, RegexOptions.IgnoreCase))
            {
                Type paramType = pi.ParameterType;
                string value = Regex.Replace(_m.Value, $"-{pi.Name}=", "", RegexOptions.IgnoreCase).Replace("\"", "").Trim();
                param[i] = Convert.ChangeType(value, pi.ParameterType);
            }
            i++;
        }
        return m.Invoke(null, param);
    }

它有效,但可能会更好。