Nochmal StringRegExp()-Spezialisten gefragt...

  • Hallo zusammen,

    gibt es eine Möglichkeit in einem String von Ziffern die jeweils NUR EINMAL vorkommende Ziffer zu finden?
    Bsp.: "1231234567567" findet die 4, oder die Position innerhalb des Strings.

    Wenn es die Möglichkeit gäbe, alle einfach vorkommenden Ziffern zu finden wäre das natürlich optimal.

    Zzt. löse ich diese Aufgabe mit stringinstr() und der überprüfung auf das 2. Vorkommen der Ziffer im String, eliminieren usw. bis nur noch nicht mehrfach vorkommende Ziffern übrigbleiben. Aber da ich mich ein bisschen intensiver mit den StringRegExp()-Möglichkeiten auseinandersetzen wollte und schon einige Stunden mit div. Online-RegEx-Trainern verbracht habe, fand ich das eine schöne Übung ?( ...
    ausserdem könnte die RegEx Zeit in meinem Sudoku-Solver sparen :thumbup:

    thx vorab
    Andy

    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

    Einmal editiert, zuletzt von Andy (1. Mai 2009 um 11:47)

  • Kann dir leider nur diese Lösung anbieten.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>

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

    $String = '1231234567567'
    $array = StringRegExp($String, '\d', 3)
    $array = _ArrayUnique($array)
    _ArrayDelete($array, 0)
    _ArraySort($array)
    _ArrayDisplay($array)

    [/autoit]
  • funkey
    thx, aber dein Script "vereinzelt" alle im String vorkommenden Ziffern, ich bräuchte aber einen Treffer auf der 4, da diese Ziffer die einzige im String ist, die nur einmal vorkommt.

  • Hallo Oscar,
    Vielen Dank!
    Auf StringRegExpReplace() statt StringRegExp() muss man auch erstmal kommen.... :thumbup:
    thx
    Andy

  • [autoit]

    $string = '2462361231234567567' ; 4 und 3 kommen doppelt vor, werden trotzdem als lösung ausgegeben
    ;$string = '83211234756567' ; 8 und 4 kommen jeweils nur einmal vor
    MsgBox(0,0, StringRegExpReplace($string, '(\d+)(.*)\1', '\3'))

    [/autoit]


    Hallo Oscar, habe dein Beispiel nachvollzogen. Die Idee ist schonmal ein Anfang, funktioniert so aber nur, wenn der String geordnet ist, denn deine RegEx findet die Ziffern zwischen den mindestens doppelt vorkommenden Ziffern und maskiert diese aus.
    Bsp. 22344 findet die 3, weil match 22 und 44 aber
    23244 findet nicht, weil match 232 (alles zw den beiden 2ern) und 44
    auch 1234123 findet nicht, weil 123 doppelt vorkommt und match 1234123 , jetzt aber die \3 durch \2 ersetzt ist da die 4 ;(
    #+grmblfx

    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

    Einmal editiert, zuletzt von Andy (1. Mai 2009 um 14:50)

  • ja, ähnlich mache ichs zzt...
    thx nochmals