Ankündigung

Einklappen
Keine Ankündigung bisher.

LBS19001720 - PREG_REPLACE - String durch Regex manipulieren/ersetzen

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

    LBS19001720 - PREG_REPLACE - String durch Regex manipulieren/ersetzen

    Unter

    Hier kann ein neuer LBS geladen werden, der Stringmanipulation per Regex ermöglicht.


    Als Beispiel kann damit ein Zeilenwechsel durch ein anderes Zeichen ersetzt werden.

    Ich werde hier den ein oder anderen weiteren Usecase sammeln und das Modul ggf. ergänzen.

    Beispiel1: Zeilenwechsel durch anderen Trenner ersetzen:
    e2 = /\n/
    e3= |

    #2
    Beispiel2: Match durch PHP-Funktion weiter auswerten lassen (modifier /e).
    e1='15. April 2003'
    e2=/(\d+)\. (\w+) (\d+)/e
    e3=strlen($2)
    a1=5 (also die strlen der zweiten klammer(April). strlen('April')=5


    tmp.jpg

    Kommentar


      #3
      givemeone
      bin mit weiteren Fragen zu diesem LBS hierher umgezogen.

      Du hast mir ja freundlicherweise für folgenden String
      {"results":[{"statement_id":0,"series":[{"name":"Batterie","columns":["time","last"],"values":[["2018-12-09T18:43:05Z",40.44]]}]}]}
      die Werte
      E2: /.*,(\d+\.?\d*)].*/e
      und
      E3: round($1,1)
      ermittelt um an den Wert von 40.44 heranzukommen.

      Die Werte E2 konnte ich auch auf weitere Datenbankabfragen aus der InfluxDB verwenden und die Ergebnisse sind korrekt.

      Nun habe ich allerdings negative Werte abgefragt und E2 kann kein Ergebnis mehr liefern.
      String:
      {"results":[{"statement_id":0,"series":[{"name":"Batterie","columns":["time","last"],"values":[["2018-12-09T18:47:05Z",-0.9]]}]}]}
      Ergebnis:
      {"results":[{"statement_id":0,"series":[{"name":"Batterie","columns":["time","last"],"values":[["2018-12-09T18:50:05Z",-0.9]]}]}]}
      Erschwerend kommt noch hinzu, dass der Wert positiv (also ohne Vorzeichen) und negativ sein kann.
      Lässt sich hierfür evtl. auch eine Lösung ermitteln?

      Und dann hätte ich noch eine Frage zu E3. Du hast mir in deinem Lösungsvorschlag gleich eine Rundungsoption mit eingebaut. Ist hier evtl. auch zusätzlich noch eine Berechnung /100 ebenfalls möglich?

      Eilt alles nicht, wenn Du halt mal lust und zeit hast.
      Grüße
      Thoms

      Kommentar


        #4
        Selbverständlich.
        Wieder ungetestet, kann's erst morgen prüfen:


        E2: /.*,(-?\d+\.?\d*)].*/e
        und
        E3: round($1/100,1)
        du kannst das übrigens alles im Livemode testen ein Aktivieren ist dafür nicht nötig....

        Kommentar


          #5
          Danke!!!
          Habe es getestet. Der neue Wert E2 kann für pos. und neg. Werte verwendet werden.

          Kommentar


            #6
            Hallo!

            Ich muss nochmals auf Hilfe bei der Verarbeitung eines Strings aus der Abfrage einer Influx Datenbank zurückkommen.

            Folgende Werte sind erfasst:
            String:
            {"results":[{"statement_id":0,"series":[{"name":"Summen","columns":["time","last"],"values":[["2019-01-02T12:54:05Z",633350]]}]}]}
            E2:
            /.*,(-?\d+\.?\d*)].*/e
            E3:
            round($1/1000,2)
            E4:
            1
            E5:
            [kein Eintrag]

            Als Ergebnis erhalte ich die erwünschte Ausgabe von 633.35

            Nun zum Problem:
            Mit dem Ergebnis lässt sich irgendwie nicht rechnen. Ich vermute das Ergebnis wird nicht als Zahl angesehen.
            Ich konnte folgende Abweichung zu "echten" Zahlen feststellen:
            In der Liveansicht eines KO sind die Werte ja zunächst ausgewählt. Drückt man dann die rechte Pfeiltaste steht man bei einer "echten" Zahl ohne jegliches Leerzeichen direkt hinter der Zahl.
            Beim vom LBS errechneten Wert bin ich jedoch nach betätigen der rechten Pfeiltaste in der 2. Zeile der Liveansicht. Als ob ein Zeilenumbruch oder LF mit dabei ist.
            Ich hoffe ich habe mich einigermaßen verständliche ausgedrückt.

            Kann dieser "Zeilenumbruch" noch irgendwie bereinigt werden, damit ich direkt mit dem Ergebnis rechen kann?

            Grüße
            Thomas

            Kommentar


              #7
              Zitat von Terrorwiesel Beitrag anzeigen
              Mit dem Ergebnis lässt sich irgendwie nicht rechnen.
              Kannst du das näher erläutern?
              Bei mir funktioniert der Baustein genau so wie beschrieben. Auch wenn ich deine Daten reinkopiere und dann zum Beispiel das Ergebnis als Input für einen Additions-LBS nehmen, dann kommt das Richtige raus.

              Kommentar


                #8
                Hast du diesen Zeilenwechsel Ich in den Inputdaten enthalten? Gibt es dort diesen "Zeilenumbruch" auch? Dann hätte ich eventuell eine Idee dazu. Poste doch Mal den exakten Inputstring.

                Kommentar


                  #9
                  jonofe

                  Hallo.
                  Ich bin inzwischen auch selbst etwas weitergekommen. Der LBS wurde zwischenzeitlich um die Funktion "Weglassen eines Zeilenumbruchs" erweitert. Hierzu habe ich einen Thread gefunden und givemeone erklärt es auch in der Hilfe zum LBS.

                  Wenn ich jetzt nun das Ergebnis in weiteres mal in diesen LBS zuführe kann ich den Zeilenumbruch entfernen und erhalte eine Zahl mit der gerechnet werden kann.
                  48b47e0c-b970-4c84-a670-a47140dbfc9e.png

                  Nun stellt sich mir die Frage, ob ich dieses /\n/ auch irgendwie in den 1. LBS unter E2 mit unterbringen kann. Diverse Versuche sind bis jetzt gescheitert. Allerdings habe ich auch keinerlei Ahnung davon - obwohl es gevemeone mir sogar mal erklärt hat.
                  Angehängte Dateien

                  Kommentar


                    #10
                    Was hast du denn alles getestet?


                    Bin noch unterwegs, aber

                    E2:
                    /.*,(-?\d+\.?\d*)].*\n?/e


                    Sollte funktionieren.

                    SG Joe

                    Kommentar


                      #11
                      Eigentlich sollte preg_replace ja ohnehin nur das zurückliefern, was in den Klammern steht und da sollte ja eigentlich kein Zeilenumbruch dabei sein.
                      Du könntest aber noch ein trim() um das round() machen, also:

                      Code:
                      trim(round($1/1000,2))

                      Kommentar


                        #12
                        Zitat von jonofe Beitrag anzeigen
                        Eigentlich sollte preg_replace ja ohnehin nur das zurückliefern, was in den Klammern steht und da sollte ja eigentlich ...
                        Das ist so nicht richtig. Das macht preg_match, aber replace ersetzt eben. Und wenn ein Text außerhalb des suchstrings nicht gefunden wird, bleibt dieser vorhanden.
                        Und auch der trim sollte nicht helfen, da in diesem per Definition tatsächlich kein zeilenwechsel vorkommen dürfte. Wenn ich die Beschreibung recht verstehe, müsste der danach kommen. Daher habe ich den RegEx oben noch mal angepasst. Bitte einfach testen.

                        SG Joe
                        Zuletzt geändert von givemeone; 02.01.2019, 17:25.

                        Kommentar


                          #13
                          givemeone
                          E2 wie in Post #10 beschrieben funktioniert.

                          jonofe
                          trim führt leider zu keiner Änderung.

                          Super! Vielen Dank für Eure schnelle Hilfe und alles Gute in 2019.

                          Kommentar


                            #14
                            Hallo, ich brauche da Mal etwas Unterstützung:

                            Ich möchte folgendes suchen:
                            <beliebige Zeichen>$unbekannt$<beliebige Ziffern>#|<beliebige Zeichen>
                            und ersetzten durch:
                            <beliebige Zeichen>$Rufumleitung$<beliebige Ziffern>|<beliebige Zeichen>
                            als z.B. suchen nach
                            … $unbekannt$015123456789#| …
                            und ersetzten durch
                            … $Rufumleitung$015123456789| …

                            der Suchstring kann ggf. mehrmals enthalten sein und soll bei jedem Fund ersetzt werden.
                            E2 = /(\$unbekannt\$[0-9]+#\|)/ und E3 = /(\$Rufumleitung\$[0-9]+\|)/ führt leider nicht zum gewünschten Ergebnis.

                            Geht das überhaupt mit dem LBS (RegEx an E3)?
                            Falls ja: wie / falls nein: habt Ihr Tipps für mich?

                            Vielen Dank
                            Marco

                            Kommentar


                              #15
                              Servus. Bekomme finde aktuell auch keine Lösung, muss mir das nochmal genauer ansehen....

                              Kommentar

                              Lädt...
                              X