Toon posts:

[VB.NET] Probleem met groepen in regular expression

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo :)

Ik heb een probleem met regular expressions, in mijn expressie maak ik een groep en in die groep maak ik vervolgens nog een groep, het probleem is dat ik de waardes uit de 2e groep (sub groep) niet kan ophalen


Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    Private Function HandleParties(ByVal PartiesText As String) As String(,)
        Dim re As New Regex("" & _
            "Name: (?<name>.*( \(laid the final blow\))?)" & _
            "(?<details>" & _
                "\r\n" & _
                "Security: (?<security>-?([0-9]\.[0-9])|-?(10\.0))\r\n" & _
                "Alliance: (?<alliance>.*)\r\n" & _
                "Corp: (?<corporation>.*)\r\n" & _
                "Ship: (?<ship>.*)\r\n" & _
                "Weapon: (?<weapon>.*)" & _
            ")?" & _
            "(\r\n\r\n\*\*\*\* Truncated - mail is too large \*\*\*\*)?")

        If Not re.IsMatch(PartiesText) Then
            Throw New Exception("Killmail invalid: Something wrong with parties.")
        End If

        Dim Parties(,) As String = Nothing
        Dim Index As Integer = 0

        For Each m As Match In re.Matches(PartiesText)
            ReDim Preserve Parties(5, Index)

            Parties(0, Index) = m.Groups("name").Value.Trim
            Parties(1, Index) = m.Groups("security").Value.Trim
            Parties(2, Index) = m.Groups("details.alliance").Value.Trim
            Parties(3, Index) = m.Groups("details.corporation").Value.Trim
            Parties(4, Index) = m.Groups("details/ship").Value.Trim
            Parties(5, Index) = m.Groups("details/weapon").Value.Trim

            Index += 1
        Next

        Return Parties
    End Function


De name ophalen gaat perfect de security, alliance, corporation, ship en weapon ophalen werkt niet.

De tekst die ik probeer te parsen ziet er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Name: name1
Security: -10.0
Alliance: None
Corp: corporation1
Ship: Raven
Weapon: Cataclysm Cruise Missile

Name: name2 (laid the final blow)
Security: -9.8
Alliance: None
Corp: corporation1
Ship: Raven
Weapon: Devastator Cruise Missile

Name: name3
Security: -8.5
Alliance: None
Corp: corporation1
Ship: Dominix
Weapon: Praetor I


Zelf heb ik al verschillende dingen geprobeerd maar niks werkte, kon er helaas ook geen oplossing vinden op google. De enige oplossing die ik heb gevonden is nog een expressie maken voor de "details" groep, maar ik hoop het anders op te kunnen lossen.

Verwijderd

Topicstarter
Iemand een idee? :)

Verwijderd

Ja, regex niet gebruiken :) Het is namelijk compleet onzinnig want je bent niet opzoek naar patronen. Gebruik een line reader zodat je key-value pairs in handen hebt. Deze hoef je enkel nog te splitsen op het ':' character.

  • Tony L
  • Registratie: September 2005
  • Laatst online: 07-11-2015
Zoals mark al aangeeft is't beetje nutteloos om regex hier te gebruiken. Is het niet een idee om met XML te gaan werken of iets anders waarmee je data kan opslaan en eenvoudig kan uitlezen? Kan je veel beter met je data om gaan dan wat jij nu probeert te doen.

[ Voor 15% gewijzigd door Tony L op 22-04-2007 12:33 ]

PSN: Norfirin


Verwijderd

Topicstarter
Ok, ik ga het met aan line reader proberen, ik heb helaas niet zelf in handen hoe ik die data binnen krijg dus kan helaas niet met XML werken.

Verwijderd

Topicstarter
Ben er nog ff mee bezig geweest en heb een manier gevonden waarmee het werkt op de manier die ik wil :)

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
        Dim re As New Regex("" & _
            "(" & _
                "Name: (?<name>.*)\r\n" & _
                "Security: (?<security>-?([0-9]\.[0-9])|-?(10\.0))\r\n" & _
                "Alliance: (?<alliance>.*)\r\n" & _
                "Corp: (?<corporation>.*)\r\n" & _
                "Ship: (?<ship>.*)\r\n" & _
                "Weapon: (?<weapon>.*)" & _
            ")|(" & _
                "Name: (?<name>.*)" & _
            ")")

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 07:54

Janoz

Moderator Devschuur®

!litemod

Tja, deze oplossing heeft wat mij betreft een heel hoog 'met een schroevendraaier en spijker in een plank sla'-gehalte hoor.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1