复制正则表达式匹配后的每一件事

时间:2015-01-05 05:18:07

标签: c# regex

我必须创建一个函数GetSourceCodeOfClass("ClassName",FilePath)这个函数将被使用超过10000次从c#Files获取Srouce代码,并且从每个源文件我必须提取完整类的源代码,即

  

" class someName {正文中的所有内容,包括sinature }"

现在这很简单,如果单个文件包含单个类但是会有许多源文件包含两个以上的类,则更大的问题是单个类中可能存在嵌套类。

我想要关注的事情: -

  • 我想提取给定类的完整来源
  • 如果文件包含两个以上的类,那么我只想提取指定类的源代码。
  • 如果文件包含多个类,并且我的指定类中包含嵌套类,那么我想捕获myClasses的源代码以及所有嵌套类。

我在中间有一个算法:
1开文件
2匹配正则表达式(C#类签名) - 参数化

  

@&#34;(public | private | internal | protected | inline)?[\ t] *(静态)?[\ t \ t   ] class [\ t] &#34; + sOurClassName + @&#34;(([\ t] [:] [\ t] ([a-zA-z] +(([   ] )[,]([] )\ w +))+))?\ s [\ n \ r \ t \ s]?{&#34; < / p>

3-如果在源文件中匹配正则表达式 4在此时开始复制,直到再次匹配相同的正则表达式但没有参数 正则表达式是:

  

@&#34; (public | private | internal | protected)?[\ t] *(静态)?[\ t] 类[\ t \ t   ] \ w + (([\ t] [:] [\ t] ([a-zA-z] + (([] )[,]([   ] )\ W +)的)+))\ S [\ n \ r \吨\ S] {&#34;?

(这是我不知道的地方,我被卡住了。我希望在第一次匹配之后复制所有东西,或者在第一次匹配之后复制到结束之后)

复制嵌套类仍然是一个问题,如果有人有想法,我仍在考虑它,也可以帮助我。

注意 - match.groups [0]或match.groups [1]这只会复制签名,但我想要完整的类源,这就是我这样做的原因。 ..

BTW我正在使用C#

1 个答案:

答案 0 :(得分:0)

我同意Nathan的观点,即你会更好地使用现有的C#-aware解析器。试图为任务编写正则表达式是很多工作,并且你不太可能在第一次尝试时做到正确。它可能适用于您的第一个示例代码,甚至可能适用于前几个代码,但最终您会发现一些代码与您的预期略有不同,并且正则表达式无法捕获重要内容。

那就是说,如果你对这种限制和风险感到满意,你所询问的一般技术(如果我理解正确......问题并不完全清楚)是很常见的,如果你期望使用正则表达式,那么值得理解很多。要理解的关键点是,使用Match对象,您可以调用NextMatch()方法来获取下一个匹配,并且在调用Regex.Match()方法时,您可以通过要检查的子字符串的开始和长度,它会将其处理限制为该子字符串。

您可以使用后一点从一个正则表达式切换到另一个正则表达式。

在您的场景中,我理解您要运行包含特定类名的正则表达式,在文件中查找该特定类,然后在初始匹配后搜索文本中的任何后续类。文件。如果第二次搜索找到了某些内容,则只希望将文本从第一个匹配的开头返回到第二个匹配的开头。如果第二次搜索没有找到任何内容,则需要将文本从第一个匹配的开头返回到整个文件的末尾。

如果这是正确的,那么这样的事情应该有效:

string ExtractClass(string fileContents, Regex classRegex, Regex nonClassRegex)
{
    Match match1 = classRegex.Match(fileContents);

    if (!match1.Success)
    {
        return null;
    }

    Match match2 = nonClassRegex.Match(fileContents, match1.Index + match1.Length);

    if (!match2.Success)
    {
        return fileContents.Substring(match1.Index);
    }

    return fileContents.Substring(match1.Index, match2.Index - match1.Index);
}

我应该注意,在两个类声明之间,或者在单个类声明的结尾和文件的实际结尾之间,很容易就会有其他非空白文本不属于类声明。我假设你有一个处理这个问题的计划。

如果以上内容无法满足您的需求,您应该仔细检查您的问题,并对其进行长度和清晰度的编辑。