这段代码用RegEx做了什么?

时间:2012-06-04 17:49:06

标签: c# regex

一直在研究一个示例源代码而我无法理解这一部分,这段代码在做什么? 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");
    }
  }

2 个答案:

答案 0 :(得分:2)

我认为此图片解决了您发布的代码中发生的事情:

RefDLL

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

  

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

似乎该项目缺少文档,因此很难推断为什么代码的作者选择了特定的方式来添加引用的DLL,当已经存在using directive时。也许他这样做是为了避免与using statement发生冲突。

答案 1 :(得分:1)

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

然后,^断言,“字符串必须开始,没有前面的字符......”而最后的$断言,“字符串必须结束此处,没有后续字符。“

[/']{2}恰好与斜杠或单引号字符中的两个匹配,即//''/''/

REFDLL 与您看到的完全匹配。

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

总之,它试图匹配像

这样的东西
//REFDLL helloworld foobar

并在ref中存储“helloworld foobar”。