gpt4 book ai didi

c# - 无需使用库即可解析命令行的 RegEx 函数

转载 作者:太空狗 更新时间:2023-10-30 00:07:48 31 4
gpt4 key购买 nike

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

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

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

你如何使用正则表达式来做到这一点?我意识到有命令行解析器。我粗略地看了一个流行的,但它没有处理可以有多个同名参数的情况。无论如何,不​​要学习如何使用命令行解析库(改天再说)。我有兴趣更多地了解 RegEx 函数。

您将如何使用 RegEx 函数来解析它?

最佳答案

link在 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);

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

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();

关于c# - 无需使用库即可解析命令行的 RegEx 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17051623/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com