Regex einfache mathematische Eingaben

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Regex einfache mathematische Eingaben

    Moin Moin,

    ich hab vor kurzem angefangen mich etwas mit regular Expressions zu beschäftigen.
    Ich habe nun versucht, simple matehmatische Eingaben zu prüfen und zu zerlegen. Sowas wie 2 + 2, 5 - 3 usw. sind überhaupt kein Problem.

    Ich bin soweit, dass diese Eingabe: -0.5 + 3 + (-5 / (2+1) + 100) gut funktioniert, und ich mit preg_match_all alles das so herausbekomme was ich möchte. Bei den Klammern hab ich mir das so überlegt, dass die komplette Klammer genommen wird, wieder auf klammern geprüft wird und diese von innen nach außen aufgelöst werden.
    Im Array sieht das dann so aus:
    Code:
    array(5) { 
      [0]=>   string(4) "-0.5"   
    [1]=>   string(1) "+" 
      [2]=>   string(1) "3"   
    [3]=>   string(1) "+" 
      [4]=>   string(18) "(-5 / (2+1) + 100)" 
    }
    In der Funktion dazu wird im 5. Element dann die Klammer entfernt und das ganze neu betracht. Das funktioniert.

    Diesen Ausdruck hab ich dafür geschrieben:
    Code:
    #(\(.*\))|(-?\d*\.\d+)|(-?\d+)|([\+\-\*/x])#
    In der ersten Bedingung sag ich ja, dass alles innerhalb der Klammern sein darf, war ein erster Versuch und hat bei dem Beispiel oben auch funktioniert.
    Wenn aber nun zwei klammern enthalten sind dann wird es problematisch.
    Bei dieser Eingabe wird es schwierig für mich: (5 * 5) + (3 * 5).

    Das Array daraus ist das:
    Code:
    array(1) { 
      [0]=>   string(17) "(5 * 5) + (3 * 5)" 
    }
    Es wird von "(" bis ")" erkannt, und natürlich alles dazwischen kommt mit. Es sollten aber eigentlich 3 Elemente sein "(5 * 5)", "+" und "(3 * 5)".
    Da aber Klammern in den Klammern erlaubt sein soll kam ich auf die Idee zu prüfen ob es ").*(" gibt, bzw. nicht gibt mit [^\(.*\)]. Aber leider ohne Erfolg

    Hat da jemand einen Tipp für mich? wäre cool!

    Gruß

  • #2
    Uh, regexp. Mein Lieblingsthema.
    Schon mal probiert, die Klammern im String zu escapen?

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Regex ist bei sowas nicht zielführend. Du brauchst hier einen Parser.

      Kommentar


      • #4
        Hey,
        danke für die Antworten.
        Ich möchte keinen komplexen Rechner programmieren. Ich möchte nur etwas mit den regular Expressions zurecht kommen. Nachdem das mit den normalen berechnungen funktioniert haben wollte ich nur noch Klammern einbauen, aber sonst kommt da nix mehr. Mir fallen noch mehr sachen zum ausprobieren ein

        @Peter:
        was meinst du mit escapen?

        Kommentar


        • #5
          Moin,
          habs selbst rausbekommen. Ich hab mal mit dem modifier U rumgespielt und im ganzen passt das dann nicht, da zweistellige Zahlen dann auch zerteilt werden. Aber nur auf die Klammergeschichte angewendet passt es dann wieder.
          hier hab ich es nachgelesen.

          Also hab ich nur
          Code:
          (\(.*\))
          durch
          Code:
          (\(.*?\)+)
          ersetzt.
          Jetzt werden die Element korrekt aufgeteilt.

          Kommentar

          Lädt...
          X