我正在构建一个VB Parser,我必须将VB类解析为文件。
现在我正在这样做:
Dim lines As List(Of String) = File.ReadAllLines(fileName).ToList()
其中fileName
是要解析的vb类文件的实际路径。但是我主要担心的是它实际上会获取文件中的所有行。
所以说我有一个看起来像这样的vb.class:
Public Class Class1VB
Friend item1 As String
Friend item2 As String
Friend item3 As String
Friend item4 As String
Friend item5 As String
Friend item6 As String
Public Sub New()
MyBase.new()
End Sub
Public Overrides Sub InstanciateVariables()
item1 = New String()
item2 = New String()
item3 = New String()
item4 = New String()
item5 = New String()
item6 = New String()
End Sub
End Class
#End Region
我只想要位于InstanciateVariables()
数组lines
Sub中的项目,有没有办法使用Linq
或任何可用的VB逻辑?
答案 0 :(得分:1)
你的文件有多长?如果它们不是很大,您可以将整个文件的内容加载到单个字符串中,然后使用String.IndexOf()来标识字符串中的位置,其中" InstanciateVariables()"代码出现。接下来,找到" End sub"的后续位置。出现然后执行string.substring()操作以提取所需内容。
答案 1 :(得分:1)
你可以1)将整个列表放入ListOfAllLines,2)循环,逐个读取每一行,直到你到达循环中的“InstanceVariables”,3),从ListOfAllLines复制到ListOfImportantLines直到你得到“End Sub”,4)停止阅读ListOfAllLines并删除它。
答案 2 :(得分:1)
如果您使用File.ReadLines()
而不是File.ReadAllLines()
,则会获得IEnumerable(Of String)
,您可以使用Linq查询,同时读取所需的最小行数。例如这将获得InstanciateVariables
的内容,没有Sub
和End Sub
行,并且只能读取End Sub
行。
Dim lines = File.ReadLines(fileName)
Dim selectedLines = lines.
SkipWhile(Function(x) Not x.Contains("InstanciateVariables()")).
Skip(1).
TakeWhile(Function(x) Not x.Contains("End Sub"))
For Each l In selectedLines
Console.WriteLine(l)
Next
它仍然必须阅读Public Overrides Sub InstanciateVariables()
行之前的所有行 - 我不知道有什么方法可以避免这种情况。
如果你想要Sub
和End Sub
行更麻烦,但你可以创建一个扩展方法来包含线:
<Extension>
Public Iterator Function TakeUntilInclusive(Of T)(data As IEnumerable(Of T), predicate As Func(Of T, Boolean)) As IEnumerable(Of T)
For Each item In data
Yield item
If predicate(item) Then
Return
End If
Next
End Function
然后使用:
Dim lines = File.ReadLines(fileName)
Dim selectedLines = lines.
SkipWhile(Function(x) Not x.Contains("InstanciateVariables()")).
TakeUntilInclusive(Function(x) x.Contains("End Sub"))
For Each l In selectedLines
Console.WriteLine(l)
Next