1

使用 C# 在 .NET 4.0 中进行开发。(对不起,如果这是冗长的......)

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

public static string GetCmdLineArgs(
    string cmdLine,
    string pathname )
{
    ...
}

我想创建一个正则表达式模式,让我可以在可执行文件的路径名之后提取参数。规则:

  1. 命令行可能会或可能不会以路径名开头。
  2. 如果路径名存在,它将被引用。
  3. 路径名将是绝对路径。因此,它将包含正则表达式特殊字符,例如“\”、“.”,可能还有其他字符。
  4. 如果引用的路径名没有出现在命令行的开头,只需捕获并返回命令行,减去任何前导空格。
  5. 路径名也可能出现在参数中。如果是这样,则应保留此类事件并将其与其余参数一起返回。
  6. 应该丢弃前导路径名周围的空白字符。
  7. 目前,在单个字符串中返回所有参数就足够了,但将来可能会添加特定参数的捕获组。

我意识到我可以通过使用简单的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...
}

显然,上述内容不会按原样工作,因为pathname. 有什么方法可以修改它,让它像我描述的那样工作吗?是否有一个分组运算符可以让我匹配未转义的字符串,或者我是否必须pathname通过转义所有可能的特殊字符来进行转换?

如果已在其他地方提出并回答了此问题,请指向该帖子。谢谢!

4

2 回答 2

3

Regex.Escape。我认为这是你唯一缺少的东西。像这样使用

string pattern = 
    @"^\s*(?:""" + Regex.Escape(pathname) + """)?\s*(.*)";
于 2012-10-08T17:37:11.360 回答
0

不要使用硬值,而是使用锚类型标记。在此示例中,我知道 - 将命令行选项与具有“”的路径分开。这样我已经标记了输出并且可以提取参数的顺序和包含的路径。我正在使用 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
                  })
                  ;

令牌的输出是:

在此处输入图像描述

于 2012-10-08T17:42:34.120 回答