0

一直在研究一个示例源代码,这部分我看不懂,这段代码是做什么的?主要是RegEx部分......

在使用的参数中,“code”是一个字符串,是我们传入的C#源代码。

  Match m = null;
  if ((m = Regex.Match(code, "(?ims)^[/']{2}REFDLL (?<ref>.+?)$")).Success)
  {
    foreach (string refDll in m.Groups["ref"].Value.Split(new char[] { ';', ',' }))
    {
      //2008-06-18 by Jeffrey, remove redundant \r
      string mdfyRefDll = refDll.Replace("\r", "").Replace("\n", "");
      //trim the ending .dll if exists
      if (mdfyRefDll.ToLower().EndsWith(".dll"))
          mdfyRefDll = mdfyRefDll.Substring(0, mdfyRefDll.Length - 4);
      string lcRefDll = mdfyRefDll.ToLower();
      if (lcRefDll == "system.data.linq" || lcRefDll == "system"
          || lcRefDll == "system.xml.linq" || lcRefDll == "system.core")
        continue;
      cp.ReferencedAssemblies.Add(mdfyRefDll + ".dll");
    }
  }
4

2 回答 2

2

我认为这张图片解决了您发布的代码中发生的情况:

引用DLL

Mini C# Lab的项目描述如下:

一个方便的工具,用于简单的短 C# 代码运行和测试,您可以节省等待 Visual Studio 启动的时间,避免创建大量一次性项目文件。

似乎该项目缺少文档,因此很难推断为什么代码的作者在已经有using 指令的情况下选择这种特殊方式来添加引用的 DLL。也许他这样做是为了避免与using 语句发生冲突。

于 2012-06-04T18:39:42.553 回答
1

首先,(?ims)是指定选项。 i触发不区分大小写,m指定多行模式,并且s(IIRC) 启用 dot-all 选项,这意味着通配符.包含换行符。

然后,^断言,“字符串必须这里开始,没有前面的字符......”而$在结尾断言,“字符串必须在这里结束,没有后面的字符。”

[/']{2}完全匹配斜杠或单引号字符中的两个,即//, '',/''/.

REFDLL 与您所看到的完全匹配。

匹配所有剩余的(?<ref>.+?)字符(最后的问号是不必要的),记住,由于s选项,这包括换行符。此部分存储在名为 的匹配项中ref

总之,它试图匹配类似的东西

//REFDLL helloworld foobar

并将“helloworld foobar”存储在ref.

于 2012-06-04T18:05:50.187 回答