StringRegExp Problem

  • Hi,
    Oscar hat mit eben schon geholfen, allerdings habe ich jetzt gemerkt, dass das auch nicht die Lösung ist, die ich suche.


    #include <Array.au3>
    $string = 'anfang fdsafdsafdjsafhjdsafhdkjsa anfang##123##ende dasfdafdsafdsaa anfang anfang##456##ende ende ende anfang##789##ende'
    $string = StringRegExp($string, '(anfang.+ende)', 3)
    _ArrayDisplay($string)


    Ich möchte aus dem String alle anfang##***##ende rausfiltern.
    Also
    anfang##123##ende
    anfang##456##ende
    anfang##789##ende


    Das Problem ist, dass immer das erste 'anfang' gematcht wird, anstatt das letztmögliche.


    $string = StringRegExp($string, '.*(anfang.+ende)', 3)
    Mit dem Pattern wird lediglich das letzte gefunden.
    Kann mir jemand helfen? :)


    Danke
    anno2008

  • Theoretisch geht das so, aber in meinem String später können alle möglichen Zeichen vorkommen. Deshalb würde sich .+ halt anbieten.
    Es gibt doch bestimmt ne Möglichkeit die Option für die 'Repeating Characters' umzustellen.

  • Das sind irgendwelche Zeichen.


    Ich habe das ganze mal abgeändert, um den Fehler zu reproduzieren:


    #include <Array.au3>
    $string = 'anfang fdsafdsaf anfang##ende djsafhjdsafhdkjsa anfang##123test##ende dasfdafdsafdsaa anfang anfang##456test##ende ende ende anfang##789test##ende'
    $string = StringRegExp($string, '(anfang##.*?test##ende)', 3)
    _ArrayDisplay($string)


    Wo steckt der Fehler? Weil man auch hier mit dem Pattern von Nuts nicht weit kommt.

  • Naja das ist ein anderer Satzaufbau. Was ist das Musterergebnis davon?


    Mein Pattern sucht "anfang##" "beliebiges zeichen beliebig oft" "##ende" (wie im ersten Post verlangt)

  • Probier mal diesen hier:
    StringRegExp($string,"anfang[^A-z0-9]{2}[A-z0-9]+[^A-z0-9]{2}ende",3)
    Bei mir hats geklappt!
    (Ob es das ist, was du willst weiss ich jedoch nicht^^)
    \\Edit: Sofern es nach dem string zwischen JEDEM "anfang##" und "##ende" gesucht werden muss,
    dann kannst du "[^A-z0-9]{2}" mit "##" ersetzen!

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • Das Pattern jetzt is doch genau das selbe.


    "anfang##" "beliebiges zeichen beliebig oft" "test##ende"


    Allerdings findet er auch Sachen, die nicht passen.
    $string = 'anfang fdsafdsaf anfang##ende djsafhjdsafhdkjsa anfang##123test##ende dasfdafdsafdsaa anfang anfang##456test##ende ende ende anfang##789test##ende'


    Irgendwas stimmt nicht. Ich glaub mitlerweile ich hab ne totale Blockade :D.


    /Edit: XovoxKingdom danke für die Mühe, aber dadrum geht es hier eigentlich nicht :). Ich will wissen wo der Fehler liegt.

  • Hm ich weiss leider nicht wie du es haben willst sorry ?(


    $string = 'anfang fdsafdsaf anfang##ende djsafhjdsafhdkjsa anfang##123test##ende dasfdafdsafdsaa anfang anfang##456test##ende ende ende anfang##789test##ende


    Mit meinem Pattern wird alles zwischen rot markierten Punkten gefunden, aber so solls nicht sein?


    edit \ Grün markiert die Treffer, diese werden auch im Array angezeigt.

  • Zitat

    Das Pattern jetzt is doch genau das selbe.

    :wacko: ich weiss leider nicht was du meinst...
    Mein Pattern gibt bei string 1 (ohne "test") das folgende aus:

    Code
    [0]|anfang##123##ende
    [1]|anfang##456##ende
    [2]|anfang##789##ende


    (jeweils ohne den index "[0]|" - das kommt aus dem Arrayview)


    und bei string2 (mit "test zwischen "anfang##" und "##ende"):

    Code
    [0]|anfang##123test##ende
    [1]|anfang##456test##ende
    [2]|anfang##789test##ende


    soll er "anfang##ende" auch ausgeben?
    oder nur "anfang####ende"
    oder wie es mir so schien auf diese Art und Weise:
    "anfang##" HIER ALLES MITNEHMEN "##ende"

    Wer immer nur das tut, was er bereits kann - wird auch immer nur das bleiben, was er bereits ist!

  • So funktioniert es: (der String anfang## darf nicht im Zwischenstring vorkommen)
    $string = 'anfang fdsafdsaf anfang##ende djsafhjdsafhdkjsa anfang##123test##ende dasfdafdsafdsaa anfang anfang##456test##ende ende ende anfang##789test##ende'
    $match = StringRegExp($string, "(anfang##(?:a(?!nfang##)|[^a])*?##ende)", 3)
    For $i = 0 To UBound($match)-1
    ConsoleWrite("Treffer: " & $match[$i] & @CRLF)
    Next

  • Nee, so solls nicht sein :).
    Das ist genau das Problem, was sich mir schon stellt, seitdem ich mit Regular Expressions in AutoIt arbeite.



    'anfang fdsafdsaf anfang##ende djsafhjdsafhdkjsa anfang##123test##ende dasfdafdsafdsaa anfang anfang##456test##ende ende ende anfang##789test##ende


    Ich hätte also gerne, dass immer das letzte 'anfang##' als start genommen wird.


    /Edit: Ja, ich glaube Progandy hat mein Problem verstanden :).
    Das muss ich mir jetzt erstmal in aller Ruhe anschauen.


    Danke Nuts, Progandy und alle die mir geholfen haben :)

  • Vielleicht habe ich es schlecht beschrieben. Mein REgEx sucht nur Übereinstimmungen, bei denen die Startsequenz nicht wiederholt wird. Probier es doch einfach aus ;)

  • Also quasi so (mal mit Klammern zum Verständnis):


    ((1*1) +(1*2)-(1*3))


    Ergebnis:
    ((1*1) +(1*2)-(1*3))
    (1*1)
    (1*2)
    (1*3)
    ?


    edit \ Ah wieder falsch verstanden? :rofl: nagut Hauptsache gelöst. :thumbup: