.Net字符串解析库,或用于解析.Net代码文件的正则表达式

时间:2009-03-05 17:28:11

标签: c# .net vb.net regex parsing

我希望能够解析vb.net代码文件,因此我可以检查Subs,Functions(及其内容,包括注释),私有变量等的集合。

可以打开实际的源代码文件。

例如,如果我有:

Public Function FunctionOne(arg1 As String, arg2 as String) as Integer
   here is some code
   ''//here are some comments
End Function

Public Sub FunctionOne(arg1 As integer, arg2 as integer)
   here is some code
   ''//here are some comments
End Sub

我希望能够解析所有子函数和公共函数与结束函数之间的所有代码(实际上,选择要么只包含其中的代码,或者整个功能定义。

这似乎需要某种解析库,或者相当不错的正则表达式技能。

有什么建议吗?

更新: 我想要实现的主要内容是解析源代码,因此反射很好,可能是为了获取函数列表,什么不是,我知道如何做到这一点,但它是的正确方法解析源代码我想弄清楚。

7 个答案:

答案 0 :(得分:6)

如何在运行时从程序中编译它们,然后在编译的库中使用反射?

查看this microsoft thread有关如何执行此操作的详细信息!

答案 1 :(得分:3)

您应该使用SharpDevelop附带的NRefactory库。

此库允许您解析VB或C#文件。它主要用于code converter,但也可用于代码分析(这就是我们在公司所做的事情)。

使用此代码:

Imports System

Class MainClass
  Public Function FunctionOne(arg1 As String, arg2 As String) As Integer
    Return Int32.Parse(arg1) + Int32.Parse(arg2)
  End Function

  Public Sub FunctionOne(arg1 As Integer, arg2 As Integer)
    Return
  End Sub

End Class

你可以得到这种结果(我在这里使用过NRefactoryDe​​mo应用程序) alt text http://img15.imageshack.us/img15/3564/stackoverflownrefactory.png

答案 2 :(得分:1)

我认为你可以使用Visual Basic.NET Lexical Grammar和解析器生成器,如FlexBison(在C / C ++中)或类似Antlr(对于.NET)

这就是编译器解析语言以完成工作的方式。

答案 3 :(得分:1)

这段代码很粗糙,但或多或​​少完成了我打算做的事情:

Private _SourceCode As String = Nothing
Private ReadOnly Property SourceCode() As String
                Get
                    If _SourceCode = Nothing Then
                        Dim thisCodeFile As String = Server.MapPath("~").ToString & "\" & Type.GetType(Me.GetType.BaseType.FullName).ToString & ".aspx.vb"
                        _SourceCode = My.Computer.FileSystem.ReadAllText(thisCodeFile)
                    End If
                    Return _SourceCode
                End Get
End Property  

Private Function extractProcedureDefinition(ByVal procedureName As String) As String
   Return extractStringContents(Me.SourceCode, "Sub " & procedureName & "()", "End Sub", True)
End Function  

Private Function extractFunctionDefinition(ByVal procedureName As String) As String
   'TODO: This works now, but wouldn't if we wanted includeTags = False, as it does not properly handle the "As xxxxx" portion
   Return extractStringContents(Me.SourceCode, "Function " & procedureName, "End Sub", True)
End Function

    Private Function extractStringContents(ByVal body As String, ByVal openTag As String, ByVal closeTag As String, ByVal includeTags As Boolean) As String
                Dim iStart As Integer = body.IndexOf(openTag)
                Dim iEnd As Integer = body.IndexOf(closeTag, iStart)
                If includeTags Then
                    iEnd += closeTag.Length
                Else
                    iStart += openTag.Length
                End If
                Return body.Substring(iStart, iEnd - iStart)
    End Function  

答案 4 :(得分:1)

madgnome对我来说是对的! 我想解析C#代码并确定名称空间,类,成员和程序集之间的关系。 NRefactory和NRefactoryDe​​mo应用程序正是我需要解决的问题,它很容易上手!

非常感谢!

答案 5 :(得分:0)

我认为您正在寻找Microsoft.CSharp.CSharpCodeProvider,它接受​​一个文件并提供对C#代码生成器和编译器的直接访问。我想它也可以接受一个字符串。

MSDN:http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx

修改

问题更新后,我发现这不相关,但仍有可能利用此对象从公共方法中提取源代码,如您所愿。我会再调查一下......

答案 6 :(得分:0)

您可以编译该东西,然后使用Reflector工具。我们都认为Reflector主要是一个GUI工具,它具有的一个简洁功能是它可以解编译.NET程序集。它可以从DLL或EXE生成源。但是Reflector本身可以通过编程方式进行控制。所以你的应用可以

  • 将源代码编译为程序集
  • 调用Reflector,要求它进行反编译
  • 以编程方式摆弄Reflector的输出 - 获取一个函数列表,以及与之相关的反编译源。

Example

这种方法可能不满足 - 因为从Reflector获得的源不是原始源,而是解编译源。评论将消失,反编译不是100%忠实于原文。功能相当但不是100%在文本上相同。

无论如何,值得一看。