C# 这段代码对RegEx做了什么
我一直在研究一个示例源代码,但我不理解这部分,这段代码在做什么?主要是正则表达式部分 在使用的参数中,“code”是一个字符串,它是我们正在传递的C#源代码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[
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