RegEx函数用于在不使用库的情况下解析命令行

Cha*_*adD 4 c# regex

我想使用空格作为我的分隔符来拆分字符串,但如果有多个单词用双引号或单引号括起来,那么我希望它们作为一个项返回.

例如,如果输入字符串是:

CALL "C:\My File Name With Space" /P1 P1Value /P1 P2Value

输出数组将是:

Array[0]=Call
Array[1]=C:\My File Name With Space
Array[2]=/P1
Array[3]=P1Value
Array[4]=/P1
Array[5]=P2Value
Run Code Online (Sandbox Code Playgroud)

你如何使用正则表达式来做到这一点?我意识到有命令行解析器.我粗略地看了一下流行的一个,但它没有处理你可以有多个具有相同名称的参数的情况.无论如何,而不是学习如何使用命令行解析库(将其留在另一天).我有兴趣更多地了解RegEx功能.

你会如何使用RegEx函数来解析它?

Cha*_*had 10

Jim Mischel评论中的链接指出Win32 API为此提供了一个功能.我建议使用它来保持一致性.这是一个样本(来自PInvoke).

static string[] SplitArgs(string unsplitArgumentLine)
{
    int numberOfArgs;
    IntPtr ptrToSplitArgs;
    string[] splitArgs;

    ptrToSplitArgs = CommandLineToArgvW(unsplitArgumentLine, out numberOfArgs);
    if (ptrToSplitArgs == IntPtr.Zero)
        throw new ArgumentException("Unable to split argument.",
          new Win32Exception());
    try
    {
        splitArgs = new string[numberOfArgs];
        for (int i = 0; i < numberOfArgs; i++)
            splitArgs[i] = Marshal.PtrToStringUni(
                Marshal.ReadIntPtr(ptrToSplitArgs, i * IntPtr.Size));
        return splitArgs;
    }
    finally
    {
        LocalFree(ptrToSplitArgs);
    }
}

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

[DllImport("kernel32.dll")]
static extern IntPtr LocalFree(IntPtr hMem);
Run Code Online (Sandbox Code Playgroud)

如果你想要一个快速,肮脏,不灵活,脆弱的正则表达式解决方案,你可以做这样的事情:

var rex = new Regex(@"("".*?""|[^ ""]+)+");
string test = "CALL \"C:\\My File Name With Space\" /P1 P1Value /P1 P2Value";
var array = rex.Matches(test).OfType<Match>().Select(m => m.Groups[0]).ToArray();
Run Code Online (Sandbox Code Playgroud)