是否可以为解析命令行请求创建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可以更好......还是组合?
*抱歉英语=)
答案 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);
}
它有效,但可能会更好。