C# 这段代码对RegEx做了什么

C# 这段代码对RegEx做了什么,c#,regex,C#,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[

我一直在研究一个示例源代码,但我不理解这部分,这段代码在做什么?主要是正则表达式部分

在使用的参数中,“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");
    }
  }
Match m=null;
if((m=Regex.Match(代码,(?ims)^[/']{2}REFDLL(?.+?)$))。成功)
{
foreach(m.Groups[“ref”].Value.Split中的字符串refDll(新字符[]{';',','}))
{
//2008-06-18由Jeffrey编写,删除冗余\r\n
字符串mdfyRefDll=refDll.Replace(“\r”和“”).Replace(“\n”和“”);
//如果存在,请修剪结束.dll
if(mdfyRefDll.ToLower().EndsWith(“.dll”))
mdfyRefDll=mdfyRefDll.Substring(0,mdfyRefDll.Length-4);
字符串lcRefDll=mdfyRefDll.ToLower();
if(lcRefDll==“system.data.linq”| | lcRefDll==“system”
||lcRefDll==“system.xml.linq”| | lcRefDll==“system.core”)
继续;
添加(mdfyRefDll+“.dll”);
}
}
首先,
(?ims)
正在指定选项
i
触发大小写不敏感,
m
指定多行模式,
s
(IIRC)启用点全部选项,这意味着通配符
包括换行符

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

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

REFDLL
与您看到的内容完全匹配

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

总之,它试图匹配以下内容

//REFDLL helloworld foobar
并将“helloworld foobar”存储在
ref

中,首先,
(?ims)
正在指定选项
i
触发大小写不敏感,
m
指定多行模式,
s
(IIRC)启用点全部选项,这意味着通配符
包括换行符

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

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

REFDLL
与您看到的内容完全匹配

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

总之,它试图匹配以下内容

//REFDLL helloworld foobar

并将“helloworld foobar”存储在
ref

中。我认为这张图片描述了您发布的代码中的内容:

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

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


该项目似乎缺少文档,因此很难推断代码作者为什么选择这种特殊的方式来添加引用的DLL,而其中已经有一个DLL。也许他这样做是为了避免与的冲突。

我认为这张图片描述了您发布的代码中发生的事情:

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

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


该项目似乎缺少文档,因此很难推断代码作者为什么选择这种特殊的方式来添加引用的DLL,而其中已经有一个DLL。也许他这样做是为了避免与冲突。

变量
code
的值范围是多少?您有任何输入/输出示例吗?@Lirik:“C#source code”是一个我们可以传递给“code”的示例。普通的C#code。它似乎使用语句查找所有的
,并将适当的程序集(引用库所需的)添加到编译器参数中。你还有什么想了解的吗?是的,很好,谢谢。第一行是做什么的?那行写着RegEx.Match?如果你能解释一下,那就太好了。感谢@acheong87的回答,我在
code
变量中使用示例C#code运行代码,它似乎不是使用
语句匹配
,而是通过
//REFDLL
关键字引用DLL。然而,在实际的C#code
//REFDLL
中,它被视为注释。您是否有任何实际的C#源代码中包含
//REFDLL
code
变量的值范围是什么?您有任何输入/输出示例吗?@Lirik:“C#source code”是一个我们可以传递给“code”的示例。普通的C#code。它似乎使用
语句查找所有的
,并将适当的程序集(引用库所需的)添加到编译器参数中。你还有什么想了解的吗?是的,很好,谢谢。第一行是做什么的?那行写着RegEx.Match?如果你能解释一下,那就太好了。感谢@acheong87的回答,我在
code
变量中使用示例C#code运行代码,它似乎不是使用
语句匹配
,而是通过
//REFDLL
键引用DLL