一直在研究一个示例源代码而我无法理解这一部分,这段代码在做什么? 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");
}
}
答案 0 :(得分:2)
我认为此图片解决了您发布的代码中发生的事情:
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”。