Regex Fragen an Experten

  • Hallo,

    ich habe einige Fragen bzgl. Regex
    und würde mich wirklich freuen, wenn mir
    jemand sagen kann warum folgende Beispiele nicht funktionieren.

    Ich habe es wirklich auf wesentliche beschränkt.
    Kopiert das bitte einfach mal in die Zwischenablage

    Spoiler anzeigen


    Vorname Anna
    Vorname Eva
    Nachname Meier
    Nachname Bauer
    Strasse Hauptstrasse
    Strasse Blumenallee


    Anhand diesem Beispiel sollen per RegEx Filter gesetzt werden.
    Ich fange mal ganz simpel an

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $sSource=ClipGet()
    $arrayfilter = StringRegExp($sSource,'name(.*+)',3)
    _ArrayDisplay($arrayfilter, "Ergebnis 1")

    [/autoit]


    Gezeigt werden alle Namen. OK! Diese möchte ich nun filtern

    Verwende ich Klammern

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $sSource=ClipGet()
    $arrayfilter = StringRegExp($sSource,'[Vorname|Nachname](.*+)',3)
    _ArrayDisplay($arrayfilter, "Ergebnis 1")

    [/autoit]

    Also, suche nach Vorname oder Nachname
    dann wird alles gezeigt, und der erste Buchstabe fehlt! Wieso?

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $sSource=ClipGet()
    $arrayfilter = StringRegExp($sSource,'[^Vorname](.*+)',3)
    _ArrayDisplay($arrayfilter, "Ergebnis 1")

    [/autoit]

    Suche nicht nach Vorname. Ergebnis stimmt auch nicht!

    Suche nach Vorname oder Strasse

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $sSource=ClipGet()
    $arrayfilter = StringRegExp($sSource,'Vorname|Strasse.*?(.*+)',3)
    _ArrayDisplay($arrayfilter, "Ergebnis 1")

    [/autoit]

    Ich fasse mal meine Fragen zusammen
    1. Wie kann ich alle Vornamen oder Strassen anzeigen? (Vornamen und Strassen)
    2. Wenn [] gesetzt wurden verschwindet der erste Buchstabe? Wieso?
    3. Verwende ich: Suche nach,oder [Vorname|Strasse] dann wird alles gezeigt!
    4. Zeile alles außer Vornamen und Nachnamen...

    Ganz egal welche Filter gesetzt werden...stimmt irgendwie nicht

    Es wäre toll, wenn ihr mir mit RegEx bzgl. Klammern...mal ein paar Filter- Beispiele machen
    könnt, damit ich das endlich verstehe.
    Auch die Hilfe hat mich nicht weitergebracht.


    Liebe Grüße
    Ilse ;)

    • Offizieller Beitrag

    Vorab: Hast du hier ein Bsp. wild erfunden, mit dem du üben willst oder ist das etwas Reales? Sollte es real sein, wäre es nicht sehr sinnvoll aufgebaut.
    Du hast hier Datensätze der Form "Vorname, Name, Strasse". Nur warum sind sie nicht zusammengehörig? Wenn schon keine Datenbank verwendet wird (was sich eigentlich bei solchen Daten anbietet), sollten Daten immer logisch zusammengehörig gespeichert werden.
    Also in Textdateien jede Zeile ein Datensatz mit z.B. per Semikolon oder Komma getrennten Einträgen. Kannst du dann auch super in Arrays einlesen und durchforsten.
    Das betrifft jetzt zwar nicht deine Regex-Frage - aber wenn dein Problem keine Übung ist, solltest du eine andere Herangehensweise bevorzugen.

  • Es geht bestimmt auch effizienter, aber es klappt zumindest:

    Code
    (?:(?:Vorname)|(?:Strasse))\s(.+)


    bringt dir den Vornamen oder die Straße (logisches oder).
    ?: bildet eine Gruppe, die aber selbst nicht als "Ergebnis" zählt.

    Zitat

    1. Wie kann ich alle Vornamen oder Strassen anzeigen? (Vornamen und Strassen)


    -siehe oben

    Zitat

    2. Wenn [] gesetzt wurden verschwindet der erste Buchstabe? Wieso?


    [...] bildet eine Menge die ohne Quantifizierer genau ein Element dieser Menge beschreibt.
    Auf Deutsch: Es muss nur irgendein Element der Menge vorkommen und passen.
    Da du es nicht via (...) zur Ausgabe führst, wird es nicht angezeigt.
    Der Rest ist dann logischerweise der String ohne das erste Zeichen und wird via (.+) angezeigt.

    Zitat

    3. Verwende ich: Suche nach,oder [Vorname|Strasse] dann wird alles gezeigt!


    Du hast vorher keine Menge gebildet vor bzw. nach der der tatsächlich gesuchte String
    gefiltert werden soll, also wird Regex nur das eine Zeichen davor nehmen!

    Zitat

    4. Zeile alles außer Vornamen und Nachnamen...


    derzeit noch keine Lösung parat...

    Ich hoffe die Antworten helfen und sind einigermaßen richtig ;)

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

  • Hallo Bugfix,

    das ist nicht real, das ist eine Übung einfach zum Verstehen!
    Mir geht es schlicht um REGEX!

    Ich benötige mal jemand der mir etwas hilft
    mit den Klammern. ([...])
    Anhand meinem Beispiel kann man das gut verstehen.

    \w+\s habe ich nicht eingebaut!

    Tutorials habe ich auch durch...
    Es geht mir einfach darum
    endlich mal die Filter per RegEx gezielt einzusetzen.

    Deswegen der PSeudoText

    Liebe Grüße
    Ilse ;)

  • Hallo XovoxKingdom,

    muß nochmal nachhaken:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $sSource=ClipGet()
    ;$arrayfilter = StringRegExp($sSource,'(?:(?:Vorname|Nachname))\s(.+)',3)
    $arrayfilter = StringRegExp($sSource,'[An|Ev)(.+)',3)
    _ArrayDisplay($arrayfilter, "Ergebnis 1")

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

    ;~ Vorname Anna
    ;~ Vorname Eva
    ;~ Nachname Meier
    ;~ Nachname Bauer
    ;~ Strasse Hauptstrasse
    ;~ Strasse Blumenallee

    [/autoit]

    hm regex sagt doch hier ganz eindeutig:
    Suche nach An oder Ev und gibt das ganze aus!
    Also
    Anna
    Eva

    verwende ich das

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    $sSource=ClipGet()
    ;$arrayfilter = StringRegExp($sSource,'(?:(?:Vorname|Nachname))\s(.+)',3)
    $arrayfilter = StringRegExp($sSource,'(Anna|Eva)(.+)',3)
    _ArrayDisplay($arrayfilter, "Ergebnis 1")

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

    ;~ Vorname Anna
    ;~ Vorname Eva
    ;~ Nachname Meier
    ;~ Nachname Bauer
    ;~ Strasse Hauptstrasse
    ;~ Strasse Blumenallee

    [/autoit]

    dann kommen leere Zeilen hinzu!
    Das mit den [] macht mir Probleme

    auch das Problem
    zeige alles außer Vornamen und Nachnamen... sollte doch
    per RegEx kein Problem sein.

    huh...

    Grüße
    Ilse ;)

  • Zitat

    hm regex sagt doch hier ganz eindeutig:
    Suche nach An oder Ev und gibt das ganze aus!


    Nein... Jedes Zeichen (mit wenigen Ausnahmen) das innerhalb von eckigen Klammern steht wird gefunden.

    Zitat


    dann kommen leere Zeilen hinzu!
    Das mit den [] macht mir Probleme


    Das liegt daran, dass "." standardmäßig keine Zeilenumbrüche findet. Jeder Zeilenumbruch ist auch ein Zeichen bzw. zwei.