[VB.net/RegEx] Multiline werkt niet...

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 12-06 21:01
...of ik doe iets fout (probably)...

In het kader van MS 70-536 lesstof ben ik met RegEx aan het spelen. Ik probeer alle exit codes uit windowsupdate.log te lezen en op de console te zetten met datum en tijd. Mijn code is als volgt, los gebaseerd op voorbeeld uit 't boek van MS Press:

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
Imports System.IO
Imports System.Text.RegularExpressions

Module Module1

    Sub Main()
        Dim sr As New StreamReader("c:\WindowsUpdate2.log")
        Dim f As String = sr.ReadToEnd
        sr.Close()

        Dim r As Regex
        Dim m As Match

        '2009-10-09 19:44:03:275    1032    19a0    Service **  END  **  Service: Service exit [Exit code = 0x240001]
        r = New Regex("^(?<date>\d{4}-\d{2}-\d{2})\s+(?<time>\d{2}:\d{2}:\d{2}:\d{3})\s+[\s\S]+\[Exit code = (?<code>\w+)\]$", RegexOptions.Multiline)
        m = r.Match(f)

        While m.Success
            Console.WriteLine("Date: {0}, Time: {1}, Exit-code: {2}", m.Groups("date"), m.Groups("time"), m.Groups("code"))
            m = m.NextMatch
        End While

        Console.ReadKey()
    End Sub

End Module


Hij processed alleen de eerste regel. Ik heb het logbestand even naar de root van c: gekopieerd en wat gespeeld, met regels bovenaan zetten die hij moet pakken en verder leeg laten. Ervaring is dat hij alleen de eerste regel leest en dan stopt. Dus wat doe ik fout?

Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
Regexen debuggen is een rotwerk, dat is waarom ik ze vaak niet gebruik. Als regex toch de beste manier is om het te doen, dan begin ik meestal simpel en werk de expressie gaandeweg verder uit.

Om wat meer grip te krijgen op het aantal resultaten dat je krijgt, zou ik Matches gebruiken in plaats van Match + MatchNext. Verder zou ik eerst proberen een hele regel te matchen en die vervolgens naar de Console te schrijven. Dan de datum capturen en zo verder. In mijn ervaring krijg je op die manier een goed idee van wat er precies gebeurt.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ik zou eerst eens je regular expression testen in een speciale tool ( Ik gebruik http://www.radsoftware.com.au/regexdesigner/, maar er zijn meer van dergelijke tools )

Verder vind ik het eigenlijk gek dat je RegexOptions.Multiline, want je wilt helemaal niet over meerdere regels matchen. Je matched "^ ..... $", wat dus inhoud dat je van het begin tot het eind van de string wilt matchen. Aangezien je Multiline matched, is het wel logisch dat hij maar 1 match kan vinden. Er is immers maar 1 begin en 1 einde in je complete string. Als je niet multiline matched, matched hij denk het begin en het einde van een regel.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 12-06 21:01
Beste Woy, mag ik u verbeteren? ^$ matchen normaal begin en einde van de string, maar met multiline, matchen ze het begin en einde van elke regel. Bedankt voor het handige programma, ik deed het testen eerst online, maar dat was traag.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Y3PP3R schreef op maandag 19 oktober 2009 @ 12:14:
Beste Woy, mag ik u verbeteren?
Dat mag altijd als ik het mis heb ;)
^$ matchen normaal begin en einde van de string, maar met multiline, matchen ze het begin en einde van elke regel. Bedankt voor het handige programma, ik deed het testen eerst online, maar dat was traag.
Maar op de een of andere manier zit er toch wat in mijn redenatie, als ik jouw RegEx kopieer, en een aantal kopieen van je voorbeeld regel, dan matchen Date en Time op de eerste regel, maar code op de laatste regel, en dat houd dus in dat de volledige text al gematched is. Het heeft dan misschien een andere reden dan de Multiline optie, maar ik zou dus eens stap voor stap je RegEx gaan debuggen.

[ Voor 8% gewijzigd door Woy op 19-10-2009 12:38 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Y3PP3R
  • Registratie: Oktober 2002
  • Laatst online: 12-06 21:01
't is opgelost, het zat waarschijnlijk in [\s\S] dat die ook regeleinden eet ofzo.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ja dat is nogal logisch. [\S] is volgens mij gelijk aan [^\s], dus met [\s\S] match je alles ;), wat je eigenlijk wilt is matchen op [^\\[]*

[ Voor 23% gewijzigd door Woy op 19-10-2009 15:35 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1