Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.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# 如何使用正则表达式在命令行字符串中搜索文件名?_C#_.net_Regex_Pathname_Capture Group - Fatal编程技术网

C# 如何使用正则表达式在命令行字符串中搜索文件名?

C# 如何使用正则表达式在命令行字符串中搜索文件名?,c#,.net,regex,pathname,capture-group,C#,.net,Regex,Pathname,Capture Group,使用C#在.NET4.0中开发。(如果这是长篇大论,很抱歉…) 我想创建一个方法,例如: public static string GetCmdLineArgs( string cmdLine, string pathname ) { ... } 我想创建一个Regex模式,让我能够提取可执行文件路径名后的参数。规则: 命令行可能以路径名开头,也可能不以路径名开头 如果路径名存在,它将被引用 路径名将是绝对路径。因此,它将包含正则表达式特殊字符,如“\”、“”,可能还有

使用C#在.NET4.0中开发。(如果这是长篇大论,很抱歉…)

我想创建一个方法,例如:

public static string GetCmdLineArgs(
    string cmdLine,
    string pathname )
{
    ...
}
我想创建一个Regex模式,让我能够提取可执行文件路径名后的参数。规则:

  • 命令行可能以路径名开头,也可能不以路径名开头
  • 如果路径名存在,它将被引用
  • 路径名将是绝对路径。因此,它将包含正则表达式特殊字符,如“\”、“”,可能还有其他字符
  • 如果引用的路径名没有出现在命令行的开头,只需捕获并返回命令行,减去任何前导空格即可
  • 路径名也可能出现在参数中。如果是这样,则应保留此类事件,并将其与其余参数一起返回
  • 应丢弃前导路径名周围的空白字符
  • 目前,在一个字符串中返回所有参数就足够了,但将来可能会添加特定参数的捕获组
  • 我意识到我可以通过使用简单的
    System.String
    操作一起破解这个函数,但我也想知道如何使用正则表达式匹配来实现它,以便为将来的更改保留灵活性

    基本上,我想做一些事情,比如:

    // Create the pattern:
    //   The pathname is anchored to the beginning of the pattern.
    //   The pathname group is non-capturing.
    //   Additional capture groups may be added in the future.
    string pattern = 
        @"^\s*(?:""" + pathname + """)?\s*(.*)";
    Regex regex = new Regex( pattern );
    Match = regex.Match( cmdLine );
    if ( match.Success )
    {
        // extract matching groups...
    }
    
    显然,由于
    路径名
    中存在正则表达式特殊字符,上述操作无法正常工作。有没有什么方法可以修改它,让它像我描述的那样工作?是否有一个分组运算符可以让我匹配未转义的字符串,或者我必须通过转义所有可能的特殊字符来转换路径名

    如果有人在其他地方问过或回答过这个问题,请给我指一下那个帖子。谢谢

    见。我想这是你唯一缺少的东西。像

    string pattern = 
        @"^\s*(?:""" + Regex.Escape(pathname) + """)?\s*(.*)";
    

    不要使用硬值,而是使用锚类型标记。在这个例子中,我知道-将命令行选项从路径中分割出来,路径有一个“.”,这样我就标记了输出,并可以提取参数的顺序和包含的路径。我使用正则表达式中的If条件(?)从路径项中过滤出命令行参数

    string commandLine = @"-abc -log ""C:\Test it"" -def";
    
    // \x22 is the escape for "
    string pattern = @"
    (?(\x22)                                # If a " then capture 
      ((?:\x22)(?<Path>[^\x22]+)(?:\x22))
     |                                      # Or
      ((?:-)(?<Command>[^-\s]+)(?:\s?))     # It is a - and capture
    )
    ";
    
    var tokens = Regex.Matches(commandLine, pattern, RegexOptions.IgnorePatternWhitespace)
                      .OfType<Match>()
                      .Select (m => new
                      {
                         Arg = m.Groups["Command"].Value,
                         Path = m.Groups["Path"].Value
                      })
                      ;
    
    string命令行=@“-abc-log”“C:\Test it”“-def”;
    //\x22是“的转义”
    字符串模式=@“
    (?(\x22)#如果是“则捕获”
    ((?:\x22)(?[^\x22]+)(?:\x22))
    |#或
    ((?:-)(?[^-\s]+)(?:\s?)#它是一个-和捕获
    )
    ";
    var tokens=Regex.Matches(命令行、模式、RegexOptions.IgnorePatternWhitespace)
    第()类
    .选择(m=>new
    {
    Arg=m.Groups[“命令”]。值,
    Path=m.Groups[“Path”].值
    })
    ;
    
    令牌的输出为: