RegEx Ausdruck

  • Hallo zusammen,

    ich hätte da eine Bitte und zwar

    benötige ich für ein Script, welches eine 'Aufarbeitung' eines rel. grossen LogFiles durchführt einen RegEx Ausdruck (denke ich zumindest).
    Es soll in dem Textfile in dem zeilenweise Einträge geschrieben wurden - siehe Bsp. - genau das eine Leerzeichen zwischen dem Datum und der Uhrzeit
    durch ein TAB ersetzt werden. Ich denke da an so etwas wie

    Ersetze das Leerzeichen, welches zwischen einer Gruppe von 10 Zeichen (im Format dddd-dd-dd) vor und einer zweiten Zeichengruppe von 8 Zeichen (im Format dd:dd:dd) danach steht

    2013-04-05 16:12:04 : Aufz. Start Mustermann AG
    vorher: 10 Zeichen vor - LEERZEICHEN - 8 Zeichen nach
    nachher: 10 Zeichen vor - TABULATOR- 8 Zeichen nach

    Leider bekomme ich den Ausdruck nicht hin :( - Wahrscheinlich ist das für einen REGEX Mächtigen ein ganz einfaches Ding

    DANKE

    mfg
    ugt100

    Einmal editiert, zuletzt von ugt100 (5. April 2013 um 19:27)

  • Probiere es mal damit:

    [autoit]


    $sLog = "2013-04-05 16:12:04 : Aufz. Start Mustermann AG" & @CRLF & _
    "2013-04-05 17:42:04 : Aufz. Start Mustermann AG" & @CRLF & _
    "2013-04-05 18:32:04 : Aufz. Start Mustermann AG" & @CRLF

    [/autoit][autoit][/autoit][autoit]

    $sLog_New = StringRegExpReplace($sLog, "(?m)(\d+\-\d+\-\d+)(\h)(\d+\:\d+\:\d+.*)", "\1" & @TAB & "\3")
    MsgBox(0, "", $sLog_New)

    [/autoit]

    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Sollte so klappen:

    Spoiler anzeigen
    [autoit]

    $sString = "2013-04-05 16:12:04 : Aufz. Start Mustermann AG"
    $sNewString = StringRegExpReplace($sString, "(\d{4}-\d{2}-\d{2}) ((?:\d{2}:){2}\d{2})", "\1" & @TAB & "\2")
    ConsoleWrite($sString & @CRLF & $sNewString & @CRLF)

    [/autoit]


    Und bitte stelle Anfragen dieser Art das nächste mal in "Programmieranfragen - Ohne Gegenleistung".

  • Es ist ja immer das 1. Leerzeichen in der Zeile, oder?

    [autoit]

    $String = StringRegExpReplace($String, "(?m)^([^ ]+) (.+)$", "$1" & @TAB & "$2")

    [/autoit]

    Edit: Zu langsam, und die vorherigen Lösungen sind sowieso besser.

  • Super Danke an Name22 und UEZ für die schnellen Antworten
    Beide 'Versionen' funktionieren.

    Zu meinem Verständnis, sehe ich das richtig
    Variante UEZ:
    StringRegExpReplace($cdeArray[$i], "(\d{4}-\d{2}-\d{2}) ((?:\d{2}:){2}\d{2})", "\1" & @TAB & "\2")
    zu prüfender String steht in der Variablen $cdeArray[i]

    'pattern' - Teil 1: 4 Ziffern-2 Ziffern-2 Ziffern
    'pattern' - Teil 2: nachfolgend 2 Ziffern:2 Ziffern:2 Ziffern

    Replace - zw. Teil1 und Teil2 setze das Zeichen = TAB

    Variante name22
    StringRegExpReplace($sLog, "(?m)(\d+\-\d+\-\d+)(\h)(\d+\:\d+\:\d+.*)", "\1" & @TAB & "\3")
    warum am Ende die \3 ???


    Gruss und nochmals Danke

    mfg ugt100

  • Du hast unsere "Versionen" falsch herum zugeordnet :whistling: .
    Die Zahlen nach dem Backslash im "Ersetzen"-String sind Backreferences zu den Ergebnissen die vorher im Pattern durch Klammern gruppiert wurden. Wenn ich einen Teil des Patterns in "()" zusammenfasse wird dieser als Gruppe gespeichert und kann im zweiten Parameter verwendet werden. "\1" wird also mit dem Ergebnis der ersten Gruppe ersetzt, "\2" mit dem Ergebnis der zweiten Gruppe. Bei mir steht das Leerzeichen zwischen den 2 Gruppen nicht in einer eigenen Gruppe, daher habe ich nur 2 Gruppen und kann sie ohne das Leerzeichen verwenden um den gesamten gefundenen String zu ersetzen (dann packe ich noch ein TAB dazwischen).
    UEZ hat sein Leerzeichen auch in einer Gruppe, daher nimmt er in seinem zweiten Parameter die erste und dritte Gruppe zum ersetzen, weil in der zweiten nur das überflüssige Leerzeichen steht.

    Im Grunde macht es keinen Unterschied welche du nimmst, zumindest in deinem Fall nicht ;).

  • stimmt - da war ein Fehler in der Zuordnung ... blöde
    Aber Dank Deiner Erklärung habe ich / bin ich dem 'Schwarzen Loch' REGEX wieder ein Stück näher.
    Das bleibt jedenfakks spannend - wird mich echt beschäftigen.


    Allen nochmals DANKE

    @James1337
    auch Dir explizit - Danke - für den Lösungsvorschlag (auch eine gute Version)
    Ich muss mit dem REGEX Thema intensiver beschäftigen, das echt grosses Potential

    mfg
    ugt100