Reputation: 77
I have a regex that matches [String] and ID. Sometimes, the second, third, etc. instance of [String] has ID lines that are blank, but the first instance of [String] always has an ID line. Right now, the 2nd, 3rd, etc. instance are returning null ID as they should because the line is blank. I am trying to retrieve the ID match from the first instance of [String] and assign it to the other instances of the same [String]. Example:
[String]
ID=18EEEEEE //
Blah
Blah
Blah
Var=Blah unsigned 8,8 /name:"Blah" /number:2542
Var=Blah unsigned 40,24 /name:"Blah" /number:2543
Output: String, EEEE, 8,8, Blah, 2542, 40,24, Blah, 2543
[String] 'Shares same ID as above because it is same name [String], but currently ID is blank. Need the above ID (EEEE)
Blah
Blah
Var=Blah unsigned 8,8 /name:"Blah" /number:2544
Var=Blah unsigned 40,24 /name:"Blah" /number:2545
Output: String, 8,8, Blah, 2544, 40,24, Blah, 2545.
Ideal Output: String, EEEE, 8,8, Blah, 2544, 40,24, Blah, 2545
Function ReadFile() As List(Of Mapping)
Dim mappings As New List(Of Mapping)()
Dim P, line, startPosition, totalLength, id, name, number As String
Dim m As Match
Dim lastId As String
Do
Dim mapping As New Mapping()
line = reader.ReadLine
If line Is Nothing Then Continue Do
m = Regex.Match(line, "^\[(\w+)\]")
P = m.Groups(1).ToString()
mapping.P = P
' Grab that code
If m.Groups.Count > 1 Then
' Read the next line after the code and get the 4 digits
'If next line is blank with no ID, use the previous ID from the 4 digit match
line = reader.ReadLine
m = Regex.Match(line, "ID=\w\w(\w\w\w\w)")
id = m.Groups(1).ToString()
If m.Success Then
mapping.id = id
lastId = id
Else
mapping.id = id
id = lastId
End If
Upvotes: 0
Views: 64
Reputation: 43743
If I understand your question correctly, all you need to do is store the last-encountered ID in a variable so you can keep using that value, as needed, until it changes. So, for instance, see where I added the lastId
variable into your code:
Function ReadFile() As List(Of Mapping)
Dim mappings As New List(Of Mapping)()
Dim P, line, startPosition, totalLength, id, name, number As String
Dim m As Match
Dim lastId As String ' *** Here ***
Do
Dim mapping As New Mapping()
line = reader.ReadLine
If line Is Nothing Then Continue Do
m = Regex.Match(line, "^\[(\w+)\]")
P = m.Groups(1).ToString()
mapping.P = P
' Grab that code
If m.Groups.Count > 1 Then
line = reader.ReadLine
m = Regex.Match(line, "ID=\w\w(\w\w\w\w)")
If m.Success Then
id = lastId ' *** Here ***
Else
id = m.Groups(1).ToString()
mapping.id = id
lastId = id ' *** Here ***
End If
Upvotes: 1
Reputation: 380
If the additional instances of [String] are always after the first one like in your example, you don't need to do much else. Do not set a new value to the ID and it will retain the previous one while it is looping through the rest of the lines. As long as you do not set it to null it will not be null.
So in the code above, simply do not do anything if the regex does not match.
Upvotes: 1