Lord45
Lord45

Reputation: 77

Regex return a previous match as a match

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

Answers (2)

Steven Doggart
Steven Doggart

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

rgorr
rgorr

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

Related Questions