Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于在不使用库的情况下解析命令行的RegEx函数_C#_Regex - Fatal编程技术网

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

C# 用于在不使用库的情况下解析命令行的RegEx函数,c#,regex,C#,Regex,我希望使用空格作为分隔符拆分字符串,但是如果有多个单词包含在双引号或单引号中,那么我希望它们作为一个项目返回 例如,如果输入字符串为: 调用“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 如何使用正则表达式来

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

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

调用“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
如何使用正则表达式来实现这一点?我意识到有命令行解析器。我粗略地看了一下一个流行的参数,但是它没有处理可以有多个同名参数的情况。无论如何,与其学习如何使用命令行解析库,不如改天再学习。我对更多地接触正则表达式函数感兴趣

您将如何使用正则表达式函数来解析它?

Jim Mischel的评论指出Win32 API为此提供了一个函数。我建议使用它来保持一致性。这是我的一个样品

static string[]SplitArgs(string unsplitArgumentLine)
{
int numberOfArgs;
IntPtr ptrtospiltargs;
字符串[]拆分参数;
ptrtospiltargs=命令行到argvw(unpritargumentline,out numberOfArgs);
if(ptrToSplitArgs==IntPtr.Zero)
抛出新ArgumentException(“无法拆分参数”,
新的Win32Exception());
尝试
{
splitArgs=新字符串[numberOfArgs];
for(int i=0;i
如果您想要一个快速、肮脏、不灵活、脆弱的正则表达式解决方案,您可以这样做:

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();
var rex=new Regex(@“(“”?“|[^”“]+)+”;
string test=“CALL\”C:\\My File Name With Space\”/P1 P1Value/P1 P2Value”;
var array=rex.Matches(test).OfType().Select(m=>m.Groups[0]).ToArray();

出于上述各种原因,我不会使用Regex

如果我确实需要,这将符合您的简单要求:

(".*?")|([^ ]+)
但是,这不包括:

  • 转义引号
  • 单引号
  • 非ascii引号(您认为人们不会将word中的智能引号粘贴到您的文件中吗?)
  • 上述各项的组合

这是我脑子里想不出来的。

@chad Henderson你忘了包括单引号,这也有一个问题,那就是捕获一组引号之前的任何内容

下面是包括单引号在内的更正,但也显示了引号之前额外捕获的问题。

在Main()中,命令行参数不是作为字符串数组提供的吗?不,我正在解析文件夹中的批处理文件。我不会使用正则表达式来处理此问题。命令行中有太多的特殊情况。您最好使用来自的其中一个建议,或者只是编写自己的建议(这可能需要几个小时)。实际上,我认为NDesk不支持多个同名参数(我可能错了)。我感觉RegEx可以处理指定的两个要求标准。这就是我想要的。问题比听起来更难。解析包含引号的Windows命令行非常奇怪。有关一些示例,请参阅。Windows实际上不像对待双引号那样对待单引号。而且您无法确保引号的类型与正则表达式中的匹配:)。只是为了好玩,我更新了我的,以支持
a“b c”d形式的arg
我很好奇windows处理单引号的方式与此有什么关系?windows将
'a b'
视为两个独立的参数,
'a
b'
工作起来很有魅力。我很惊讶看到代码超出了框架。我觉得有点脏,不知道为什么,可能是因为我不明白.sqlcmd.exe()和其他exe允许在写入param值之前,以破折号后跟一个字母的形式在params开关中添加可选的空格。例如,“sqlcmd.exe-sMyServer”和“sqlcmd.exe-s MyServer”表示相同的传递值。但是,此函数为第一个传递2个参数,为第二个传递3个参数。@ChadD-
CommandLineToArgvW
是shell用来确定如何传递参数的。sqlcmd.exe然后包含解释它们的逻辑
-s MyServer
作为两个参数传递,但sqlcmd.exe将它们同时识别为一个选项。CommandLineToArgvW解决方案不起作用,因为它不考虑\\和\”等特殊情况
(".*?")|([^ ]+)