StringRegExp Zeilenumbrüche

  • Hallo,

    Habe ein Problem mit StringRegExp und Zeilenumbrüchen. Normaleweise lösche ich vorher immer alle Zeilenumbrüche aber mit diesem Trick komme ich jetzt nicht weiter weil sonst zwei Zahlen zusammenrutschen und die eine Zahl brauche ich.

    Hier der Ausgangscode:

    Spoiler anzeigen

    Aus diesem will ich die "2049" (Zeile 44) haben. Gebeben ist mir "typeID: 2048" (Zeile 80)

    (.*):\s*.*activities:\s*.*typeID: 2048 funktioniert nicht wahrscheinlich wegen dem \s*.*
    Was muß ich da schreiben das er alle Zeichen und Zeilenumbrüche nimmt bis typeID: 2048


    Gruß
    Steffen

  • Probiers mal mit

    //EDIT
    Mit Regex hat´s nicht hingehauen wegen fehlendem Skill, daher "zu Fuß" :D

    [autoit]

    #include <Array.au3>
    $a=fileread("Test_ID.txt")

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

    $Suchstring="typeID: 2048"

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

    $rep=StringRegExpReplace($a,'(?isU)\b(\d+:)',chr(255) & @crlf&'$0') ;splitten
    $split=stringsplit($rep,chr(255),3)

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

    $ret=""
    for $i in $split
    if stringinstr($i,$Suchstring) then ;wenn treffer
    $t=stringsplit($i,@crlf,3)
    $ret=$t[1] ;erster String
    endif
    next

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

    msgbox(0,0,$ret)

    [/autoit]

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    5 Mal editiert, zuletzt von Andy (21. Dezember 2014 um 21:25)

  • Aus diesem will ich die "2049" (Zeile 44) haben. Gebeben ist mir "typeID: 2048" (Zeile 80)
    [...]
    Was muß ich da schreiben das er alle Zeichen und Zeilenumbrüche nimmt bis typeID: 2048

    Habe ich das richtig verstanden, dass du von Zeile 45 bis 79 alles haben willst?
    Falls ich das richtig verstanden habe:

    Code
    (?s)\N\d+:((?:(?!\N\d+:).)+?)typeID: 2048
  • Vielen Dank für eure schnellen Antworten.

    @AspirinJunkie

    Sorry da habe ich mich falsch ausgedrückt.

    stringregexp soll die Zahl 2049 (Zeile 44) ausgeben. Was ich habe ist 2048 (Zeile 80)


    @andi

    Deine Lösung sieht vielversprechend aus, vielen Dank.
    Aber er gibt die 2047 (Zeile 1) aus und nicht die 2049 (Zeile 44)

    Was mir jetzt auch aufgefallen ist, das ich wohl das falsche Tool zum testen nehme. Habe es immer hiermit gemacht: http://rubular.com/
    Aber Rubular gibt nur einen Fehler zurück. Darum habe ich mir eben Regexbuddy gekauft und so eingestellt (PCRE Engine usw) wie es hier im Tutorial beschrieben ist. Aber auch hier bekomme ich mit: (?is)\b(\d+:).*(?:typeID: 2048) kein Ergebnis. Nur Autoit selbst gibt 2047 aus.

    Gruß
    Steffen

  • Vielen Dank euch beiden.

    Beide Lösungen funktionieren Super.

    [autoit]

    $a=fileread("Test_ID.txt")

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

    $gegeben = 2048 ; Zeile 80

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

    $ergebnis = StringRegExp($a,'(?s)(\N\d+):(?:(?!\N\d+:).)+?typeID: ' & $gegeben,3)
    $ergebnis = $ergebnis[0]
    msgbox(0,0,$ergebnis) ; gewünschtes Ergebnis 2049 aus Zeile 44

    [/autoit]


    Gruß
    Steffen

  • Mit dem RegEx und negativem Lookahead war ich mittlerweile auch dabei, es wird langsam!
    Aber AspirinJunkie war mal wieder schneller :thumbup:

    Ich hatte statt \N aber \b und auch "greedy" gesucht statt wie AspirinJunkie "lazy".
    Da negativer Lookahead doch sowieso die in dieser Gruppe enthaltenen Pattern NIEMALS treffen soll?!

    @steffen
    ich benutze online https://regex101.com
    der erklärt immer so schön^^

  • Ich hatte statt \N aber \b

    Was definitiv besser wäre.
    Das ist ein Fehler in meinem Pattern. Ich wollte eigentlich ausnutzen, dass das Suchpattern immer an einem Zeilenanfang beginnt und hatte (warum auch immer) \N statt ^ verwendet.
    Korrigiert würde das ganze dann so aussehen:

    Code
    (?ms)^(\d+):(?:(?!^\d+:).)+?typeID: 2048

    Ich hatte [...] "greedy" gesucht statt wie AspirinJunkie "lazy".
    Da negativer Lookahead doch sowieso die in dieser Gruppe enthaltenen Pattern NIEMALS treffen soll?!

    Ich wollte den Rechner aber ein bisschen entlasten.
    Ich dachte mir: Warum soll ich ihn unnötigerweise weiter suchen lassen als nötig?
    Wenn ich das greedy geschrieben hätte, hätte er mit seinem Check nicht gleich bei Zeile 80 aufgehört zu suchen sondern hätte weiter gesucht ob nicht doch vielleicht noch ein typeId: 2048 später auftaucht. Erst in Zeile 123 müsste er diese Hoffnung begraben.

    Vom Ergebnis macht das also in diesem Beispiel keinen Unterschied - hingegen aber in der Laufzeit:

    Spoiler anzeigen
    [autoit]

    Global $N = 2500

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

    Global $s_String = ClipGet()
    Global $a_RegEx

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

    $iT = TimerInit()
    For $i = 1 To $N
    $a_RegEx = StringRegExp($s_String, "(?ms)^(\d+):(?:(?!^\d+:).)+typeID: 2048", 3)
    Next
    ConsoleWrite(StringFormat("% 20s: %8.4f ms\tErgebnis: %4d\n", "Greedy", TimerDiff($iT) / $N, $a_RegEx[0]))

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

    $iT = TimerInit()
    For $i = 1 To $N
    $a_RegEx = StringRegExp($s_String, "(?ms)^(\d+):(?:(?!^\d+:).)+?typeID: 2048", 3)
    Next
    ConsoleWrite(StringFormat("% 20s: %8.4f ms\tErgebnis: %4d\n", "Lazy", TimerDiff($iT) / $N, $a_RegEx[0]))

    [/autoit]
  • Ja, das Problem mit der Zeit hatte ich ich während der Entwicklung (im Onlinetool) recht oft.
    Wenn dort nach 2 Sekunden kein Treffer erfolgt, wird abgebrochen.

    Ich dachte mir: Warum soll ich ihn unnötigerweise weiter suchen lassen als nötig?

    Ich dachte mir: Sackzement, nach 4h rumprobieren und Dokus lesen hat´s endlich funktioniert! 8)