Kürzeste Übereinstimmung bei 'StringRegExpReplace'

  • Bei folgendem Beispiel ersetzt der Befehl 'StringRegExpReplace', beim ersten Treffer einen zu langen Teil-String.

    Beispiel
    [autoit]

    $alt = "aabbccxxddeeffxXyyyyZzgghhiiXxyyyyzZjjkkllXXyyyyZZmmnnoo"

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

    $neu = StringRegExpReplace($alt, "(?i)xx(.*?)zz", "00${1}11")

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

    Msgbox(0,"",$neu)

    [/autoit]

    Ich möchte in der kürzesten Form des Musters "xx....zz", die "xx" durch "00" ersetzen und "zz" durch "11".
    Hierbei soll die Gesamtlänge des Strings aber nicht verändert werden.

    Im Grunde funktioniert das o.a. Beispiel, nur müsste das Ersetzen erst ab dem zweiten Auftreten von "xx" das Ersetzen beginnen, da ein weiters mal "xx" vor dem "zz" vorkommt.

    Kann mir jemand erklären wo mein Fehler ist ?

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    Einmal editiert, zuletzt von Micha_he (28. Januar 2011 um 12:10)

    • Offizieller Beitrag

    Da der Punkt für jedes beliebige Zeichen steht, kann man das Verhalten folgendermassen in den Griff bekommen:

    [autoit]


    $alt = "aabbccxxddeeffxXyyyyZzgghhiiXxyyyyzZjjkkllXXyyyyZZmmnnoo"

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

    $neu = StringRegExpReplace($alt, "(?i)xx([^xz]*?)zz", "00${1}11")

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

    Msgbox(0,"",$neu)

    [/autoit]
  • Im Grunde funktioniert das o.a. Beispiel, nur müsste das Ersetzen erst ab dem zweiten Auftreten von "xx" das Ersetzen beginnen, da ein weiters mal "xx" vor dem "zz" vorkommt.


    Meinst du so?

    [autoit]

    $alt = "aabbccxxddeeffxXyyyyZzgghhiiXxyyyyzZjjkkllXXyyyyZZmmnnoo"
    $neu = StringRegExpReplace($alt, "(?i)xx((?:.(?!xx))+?)zz", "00${1}11")
    Msgbox(0,"",$neu)

    [/autoit]


    [autoit]

    $alt = "00 AB CD EF 00 5c 00 5c CC FF 12 00 5c 00 5c 55 25 66 2s FE BC DD 22 FE BC DD"

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

    $sStart = '00 5c 00 5c'
    $sEnde = 'FE BC DD'
    $neu = StringRegExpReplace($alt, "(?i)" & $sStart & "((?:.(?!" & $sStart & "))+?)" & $sEnde, "START${1}ENDE")
    MsgBox(0, "", $neu)

    [/autoit]
  • @Sprenger: Knapp daneben ;)


    Gut Oscar, Deine Lösung haut mit dem Beispiel hin.

    Nur war natürlich "xx" wie auch der Rest des Strings ein Platzhalter für andere Daten. Der eigentliche Startkenner ist die Wertekombination "00 5c 00 5c", welche ich binär aus einer Datei lese.

    Wenn ich also statt [^xz] dann [^(005c005c)] schreibe geht es nicht mehr.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    Einmal editiert, zuletzt von Micha_he (27. Januar 2011 um 17:53)

  • Meinst du so?

    Genau, so geht es ! Edit: FAST !

    In folgender Wertekombination, tritt die Kombination bei zweiten Auftreten in dreifacher Variante auf (005c005c005c).
    Wenn möglich sollte aber nur die spätere Doppel-Kombination den Start definieren, so das der erste Teil der Dreierkombi vor dem START bleibt.
    Innerhalb START-ENDE kann die Kombi (005c) einfach vorhanden sein.

    Spoiler anzeigen
    [autoit]

    $alt = "000a0b005c005c00abcd0c0d005c005c005c001234005c56789FEBCDD22FEBCDD0000000"

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

    $sStart = '005c005c'
    $sEnde = 'FEBCdd'
    $neu = StringRegExpReplace($alt, "(?i)" & $sStart & "((?:.(?!" & $sStart & "))+?)" & $sEnde, "START${1}ENDE")
    MsgBox(0, "", $neu)

    [/autoit]

    Dazu noch eine Verbesserungsidee ?

    Edit: Da ich das START-Muster nochmals verfeinern musste, hat sich das Problem dreifach auftretender Treffer minimiert, so das es wohl nicht mehr auffallen sollte.

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

    4 Mal editiert, zuletzt von Micha_he (28. Januar 2011 um 12:10)