[Java] RegEx zur Termvalidierung

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Mr. Mouse, 24. Juli 2012 .

Schlagworte:
  1. 25. Juli 2012
    Zuletzt bearbeitet: 25. Juli 2012
    AW: RegEx zur Termvalidierung

    du kannst den code gerne in der javascript konsole ausführen:
    Code:
    const RE_TERM = /[\-]?[(]?([\-]?[(]+)*[\-]?[0-9]+([\.]{1}[0-9]+)?([\+\-\*\/\^\%RL]{1}[(]*[-]?[0-9]+([\.]{1}[0-9]+)?[)]*)+/;
    
    RE_TERM.test('^1+1(1(1))1+(()())'); // true
    RE_TERM.test('5-3)^3)(('); // true
    
    /* padding */
    Code:
    1^(2(3(4))(5)
    oder kannst du das als multiplikation interpretieren?
     
  2. 25. Juli 2012
    AW: RegEx zur Termvalidierung

    Nein, es MUSS laut regex ein operator vorkommen.
     
  3. 25. Juli 2012
    Zuletzt bearbeitet: 25. Juli 2012
    AW: RegEx zur Termvalidierung

    Hab jez mal selber einen Parser für Infix to Postix geschrieben.

    Kann mit +,-,*,/,^ sowie klammern und double zahlen umgehen.

    Wen es interessiert:

    http://pasteit.com/18392

    //

    @Murdoc

    oh, deinen link gar net gesehen

    naja jez hab ichs selber gemacht^^

    trd danke
     
  4. 25. Juli 2012
    AW: RegEx zur Termvalidierung

    Weiss jemand welche Priorität Modulo und Logarithmus haben?
     
  5. 25. Juli 2012
    AW: RegEx zur Termvalidierung

    was für eine priorität sollen die haben?
     
  6. 25. Juli 2012
    AW: RegEx zur Termvalidierung

    in welcher reihenfolge abgearbeitet werden muss.

    erst potenzen, dann strichrechnung dann +/-

    wo gehören da Modulo und Log rein^^
     
  7. 25. Juli 2012
    Zuletzt bearbeitet: 25. Juli 2012
    AW: RegEx zur Termvalidierung

    modulo und log sind doch funktionen die sich auf bestimmte eingabewerte beziehen und dann einen wert zurückgeben. den behandelst du dann ganz normal ?(

    vllt meinst du das hier:

    a mod b * c

    ich denke mal, man berechnet zuerst b*c und dann a mod b*c

    das kommt allerdings drauf an, wie man bei dir den modulo eingeben muss. wenn das so aussieht: mod(a,b) isses doch eig klar oder?

    und log naja da gibt man ja normalerweise log(4+5) ein oder nich? da wir halt der logarithmus von 9 berechnet und damit weitergerechnet.
     
  8. 25. Juli 2012
    AW: RegEx zur Termvalidierung

    und was ist mit

    5%6

    oder

    Log von 5 zur Basis 2 ?

    Also die zu erst?
     
  9. 25. Juli 2012
    AW: RegEx zur Termvalidierung

    wie sieht mod und log denn bei dir in der eingabe aus? ist die basis vom log fest definiert oder kann der user sie angeben?
     
  10. 26. Juli 2012
    AW: RegEx zur Termvalidierung

    Ist variabel. Syntax:

    Für Log: <value1>L<value2> // Log von value2 zur Basis value1

    Für Mod: <value1>%<value2> // value1 Modulo value2
     
  11. 26. Juli 2012
    AW: RegEx zur Termvalidierung

    ok, dann würde ich es so machen wie ich oben schon beschrieben hab.

    5%2*3 = 5%6 = 5
    (5%2)*3 = 3

    Log analog

    das hängt allerdings auch von deiner definition ab denke ich^^
    du kannst es auch so implementieren, dass L und % stärker binden, als alle anderen operatoren.
    dann wäre das so:

    5%2*3 = (5%2)*3 = 3
    5%(2*3) = 5%6 = 5

    usw^^

    ich weiss nicht, wie es am sinnvolsten wäre, aber ich denke das kommt ganz drauf an wie es implementiert wird.
     
    1 Person gefällt das.
  12. 26. Juli 2012
    AW: RegEx zur Termvalidierung

    Genau das ist ja mein Problem. Ich denke, dass ich deine erste Variante nehme. Danke dafür.
     
  13. 26. Juli 2012
    Zuletzt bearbeitet: 26. Juli 2012
    AW: RegEx zur Termvalidierung

    normalerweise hat % die selbe gewichtung wie * und /
    zumindest hab ich das so gemacht.

    lediglich ^ ist eins höher.
    das stand so im wiki-artikel

    log würde ich an deiner stelle als funktion definieren.
     
    1 Person gefällt das.
  14. 26. Juli 2012
    AW: RegEx zur Termvalidierung

    So hier nun nochmal mein vollendeter Parser:

    http://pasteit.com/18393

    Optimierungsmöglichkeiten?
     
  15. 26. Juli 2012
    AW: RegEx zur Termvalidierung

    Code:
    postfix.contains(new String("("))) -> postfix.contains("(")
    Ansonsten hat das nicht viel mit Clean Code zu tun, was du da machst. Aber das ist ein eigenes (dennoch sehr wichtiges) Kapitel.

    Anfangen könntest du hier:
    Clean Code Developer - Clean Code Developer


    Ist für professionelle Entwicklung unumgänglich. Je eher du damit anfängst desto besser.
    (Das geht übrigens auch ohne sich diese bescheuerten Bändchen zu kaufen :lol: )
     
    1 Person gefällt das.
  16. 26. Juli 2012
    AW: RegEx zur Termvalidierung

    Bin für jede Hilfe dankbar^^

    Wieso ist das nicht clean? Hab schon versucht "sauber" zu arbeiten..^^
     
  17. 26. Juli 2012
    AW: RegEx zur Termvalidierung

    Code:
    public List<String> parseInfix(String infix)
    Die Funktion (also der Body) ist viel zu lang. Versuch das irgendwie aufzuspalten.

    Code:
    Stack<Character> st = new Stack<Character>();
    Variablennamen sind nicht wirklich aussagekräftig. Was für ein Stack ist das?

    etc etc.

    Den Rest siehst du relativ schnell, wenn du angefangen hast das Aufzuspalten.

    Damit muss man sich wirklich beschäftigen (
    Clean Code Developer - Clean Code Developer
    )
    Bei mir hat das nicht anders ausgesehen (und sieht es noch nicht, wenn ich irgendetwas schnell mache). Allerdings bringt es merkliche Vorteile, wenn du daran weiterarbeiten oder es, wie hier, zeigen willst.
     
  18. 26. Juli 2012
    AW: RegEx zur Termvalidierung

    Okay, danke für den Ratschlag Alex, ich werde mal versuchen das umzusetzen!

    Da ich z.Z. Information Engineering studiere muss ich da wohl so oder so ran, obwohl mein Prof noch schlechter programmiert -.-"
     
  19. 29. Juli 2012
    Zuletzt von einem Moderator bearbeitet: 14. April 2017
    AW: RegEx zur Termvalidierung

    Soo, für alle die das hier noch interessiert:

    Auch wenn es inzwischen eigentlich komplett vom Thema abweicht,
    ich habe mein ganzes Konzept nochmal etwas überarbeitet.

    Der Rechner beherrscht jetzt +, -, *, /, ^, % sowie Klammern.
    Der einzige rechts-assoziative Operator z.Z. ist das unäre '-'.
    Muss mir da noch was einfallen lassen für die anderen.

    Habe es jetzt auf 4 Klassen augespaltet:

    Token:

    Jeder einzelne "Teil" des Terms wird als Token angelegt. Dieser bekommt einen Typ,

    0 für Zahl
    1 für Operator
    2 für "Klammer auf"
    3 für "Kalmmer zu"
    4 für unäres '-'

    Scanner:

    Zerlegt den als String vorhandenen Term in einzelne Tokens
    und gibt diese in einer ArrayList wieder.

    Parser:

    Konvertiert die "Infix-List" zu einer "Postfix-List"
    und kann diese auch evaluieren.

    Ergebnis kommt als Double zurück.

    Operation:

    Ein Objekt für Berechnung. Nimmt entweder
    zwei Zahlen + Operator oder eine Zahl+Operator entgegen
    und liefert das Ergebnis

    Sources: Download: zCalc_0.1.zip | www.xup.in

    Ist aber teilweise unkommentiert und noch etwas durcheinander, mach ich die Tage noch.

    gn8
     
  20. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.