Regular Expression Replace hilfe

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Regular Expression Replace hilfe

    Hallo,

    Ich kämpfe seit Stunden mit einer Regular Expression. ;( Ich möchte eine art Syntax zur Dateneingabe erstellen. Dazu gibt es bestimmt schlüsselzeichen: VvHhLlRr-+?
    Diese zeichen beziehen sich auf das Vorangehende wort.

    Ein Auto kann durch verschiedene eingaben dirigiert werden: v = vorne, h = hinten, l = Links , r = rechts (Groß und Kleinschreibung sollen OK sein), + = Schneller, - = langsamer, ? = Infof Anzeigen.

    Eine eingabe könnte z.b. so aussehen: "Autoa l" bedeutet auto a soll nach links fahren. "Autob R +" bedeutet auto b soll nach rechts fahren und beschleunigen.
    Es soll aber auch eine Eingabe mehrerer Kommandos auf einmal möglich sein: "Autoa L Autob r+ AutoC h LKW1 R LKW2 l RangeRover L + ?"
    Diese soll dann durch ein RegEx in folgendes aufgetrennt werden:

    Autoa L
    Autob r+
    AutoC h
    LKW1 R
    LKW2 l
    RangeRover L + ?

    Mit dem derzeitigen code passiert aber folgenes:
    Autoa L
    Autob r+
    AutoC h LKW1 R LKW2 l RangeRover L +

    Damit ich die einzelnen kommandos trennen kann versuche ich diese per Regex zuerst durch ein ~ zu trennen und dann zu splitten:


    VB.NET-Quellcode

    1. Bezeichner = "VvHhLlRr-+"
    2. Dim rgx As New Regex("[\s]([^" & Bezeichner & "])") 'Wort gefolgt von Leerzeichen gefolgt von Bezeichner gefolgt von Leerzeichen oder String Ende
    3. p_text = rgx.Replace(p_text, "~$0")
    4. Return p_text.Split("~")


    Mein Problem ist jetzt allerdings wenn ein "Auto" mit dem gleichen Buchstaben eines kommandos das ausgeführt werden soll habe ich unterscheidungsprobleme.
    Also ein LKW wird mit l für Links verwechselt und ein RangeRover mit r für Rechts.

    Eine Kombination mit Buchstaben und +-? sollte möglich sein, mehrere buchstaben sind aber nicht notwendig.

    Kann mir jemand von euch helfen?
    Vielen Dank im Voraus! :)
    Moin,

    du hast gleich mehrere Probleme im Regex. Das erste Problem ist, dass vor deinen Steuerzeichen ein Leerzeichen stehen muss (spezifiziert durch [\s], hier wäre ein Match (non-greedy) auf auf eine a-z und A-Z angebracht). Das zweite Problem ist, dass deine Steuerzeichen Regex-Suchzeichen enthalten. Da musst du vorher mit einem Regex.Escape drübergehen.

    Außerdem kannst du mit runden Klammern Capturing-Groups definieren auf dessen Inhalt du dann mit Hilfe des Rückgabewertes von Regex.Match (Groups-Property) zugreifen kannst. Das erspart dir das Gewusel mit Replace und Split.

    Sehr gut zum Testen von Regex-Patterns eignet sich regex101.com/. Da hast du unten sogar eine Übersicht von Tokens, die du benutzen kannst.
    Mit freundlichen Grüßen,
    Thunderbolt
    Das ist eine kleine script-Sprache, die du da entwirfst. Mit Regex regexste dich da leicht zu tode.

    mach den Regexteil einfach, verwende die nur zum unterteilen des Strings in Tokens.
    Und dann musste halt einen Parser bauen, entsprechend der Grammatik deiner scriptsprache.

    Regex ist zwar fein und sehr mächtig, aber hat dennoch auch seine Begrenzungen, wo man dann wieder mit normaler Programmierung weiter machen muss.

    Und in Grenzfällen ist manchmal auch beides möglich: Entweder ein sehr großer, total cryptischer Regex, der alles erschlägt, oder ein eher läppischer Regex, und der Rest wird dann mit konventionellem Code erschlagen.