Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Frage zu RegEx am Beispiel von Pix

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Frage zu RegEx am Beispiel von Pix

    This topic has been deleted. Only users with topic management privileges can see it.
    • T
      tempestas last edited by

      Liebe Leute,

      ich versuche gerade, das Thema Regular Expressions zu durchdringen und bin dabei nur mittel erfolgreich.

      An diesem Beispiel von Pix habe ich mir bislang folgendes erarbeitet:

      // sonos.0.root.XXX_XXX_XXX_XXX.volume

      var regex_vol = /^sonos.[0-9].root.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)_(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?).volume$/;

      Ich verstehe, dass hier quasi alle möglichen Kombinationen von Sonos Instanzen durchgeprüft werden hinsichtlich volume. Ich wäre dankbar, wenn jemand meine Erkenntnisse zu den einzelnen Bereichen bestätigen oder falsifizieren könnte:

      /^sonos –-> / leitet RegEx ein, ^ bedeuted “Start des Strings”

      . –-> Backslash bedeuted, dass das Folgende, hier der Punkt, genau als das Zeichen gemeint ist.

      [0-9] –-> Character von 0 -9, hier wg. Sonos Instanz (falls mehrere vorhanden)

      .root. –-> Punkte sind als Punkte gemeint, dazu root. Ergebnis bisher: sonos.0.root. [oder sonos.1.root. oder .2.root. usw]

      Jetzt kommt die IP, hier werde ich unsicher:

      (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

      Klammern () –-> alles darin eingeschlossene abgreifen, "ein Block".

      25[0-5] –-> 250 bis 255 als Startteil der Sonos IP

      | –-> "oder"

      2[0-4][0-9] –-> 200 bis 249

      | –-> "oder"

      [01]? –-> 0 ODER 1 <u>kann</u> enthalten sein, <u>muss aber nicht</u>

      [0-9] –-> Zahl von 0 -9

      [0-9]? –-> Zahl von 0 -9 <u>kann</u> enthalten sein, <u>muss aber nicht</u>

      Bei den drei Teilen hier drüber bin ich mir sehr unsicher, denn nach meinem Verständnis kommen da etwas skurrile IP Blöcke bei raus?

      Im Ergebnis bis hierhin KÖNNTE es so aussehen:

      sonos.0.root.255

      sonos.1.root.237

      sonos.0.root.019 <– das kommt mir komisch vor, ich glaube, hier habe ich einen Verständnisfehler

      danach wird es für die nächsten drei Blöcke nochmal wiederholt, mit jeweils _ dazwischen und zum Schluss mit .volume beendet und der String geschlossen ($).

      Bin für jede Hilfestellung dankbar. Habe mich mit regex101.com und danielfett.de versucht einzulesen und das obige sind meine Erkenntnisse, die mir aber wie gesagt nicht plausible erscheinen. Irgendwas ist da wohl falsch

      Nachtrag:

      Inzwischen verstandene Teile adjustiert, Webpage Adresse korrigiert

      1 Reply Last reply Reply Quote 0
      • BBTown
        BBTown last edited by

        @tempestas:

        Jetzt kommt die IP, hier werde ich unsicher:

        (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

        Klammern () –-> alles darin eingeschlossene abgreifen, "ein Block".

        25[0-5] –-> 250 bis 255 als Startteil der Sonos IP

        | –-> "oder"

        2[0-4][0-9] –-> 200 bis 249

        | –-> "oder"

        [01]? –-> 0 ODER 1 <u>kann</u> enthalten sein, <u>muss aber nicht</u>

        [0-9] –-> Zahl von 0 -9

        [0-9]? –-> Zahl von 0 -9 <u>kann</u> enthalten sein, <u>muss aber nicht</u>

        sonos.0.root.255

        sonos.1.root.237

        sonos.0.root.019 <– das kommt mir komisch vor, ich glaube, hier habe ich einen Verständnisfehler

        sonos.4.root.97 <--- kommt mir auch komisch vor

        sonos.7.root.136 <-- ebenfalls obskur `
        Du hast eigentlich fast alles korrekt aufgelöst

        Als Ergebnis sollen die SONOS Geräte gefunden werden.

        Beispielsweise: "192_168_178_51"

        Als IP Bereiche erlaubt wären Werte bis maximal 255_255_255_255 und die RegEx prüft nun von links nach rechts alle Kombinationen durch.

        Wenn ein Wert aus 3 Ziffern besteht und die ersten Ziffern sind 25, dann kann die folgende Ziffer nur noch zwischen 0 und 5 sein. (250-255) = [0-5].

        Besteht die erste Ziffer hingegen aus einer 1, dann können die folgenden Ziffern allerdings zwischen 0 und 9 sein da der Bereich von 100 - 199 gehen könnte [0-9].

        Da auch ein- oder zweistellige Ziffernfolgen möglich sein können (z.B. 10_10_1_52) wird eine Ziffer zwingend vorgeschrieben, weitere Ziffern können jedoch optional sein.

        Das wird mit dem Fragezeichen dargestellt.

        [0-9]? soll heißen "KEINE oder genau EINE Ziffer aus dem Bereich 0-9

        die gesuchte Zahl Endet jeweils am Unterstrich "_" da dann die nächste Ziffernfolge beginnt.

        Das Pipe-Symbol | ist - wie auch korrekt von dir aufgeführt, das "ODER.

        "Die Ziffernfolge beginnt mit 25, dann kann nur noch eine Zahl von 0-5 folgen ODER die Ziffernfolge beginnt mit einer 1, dann können auch größere Ziffern folgen" usw.

        [Edit]

        Nachttrag: Die Einführung in RegEx von Daniel Fett finde ich übrigens auch großartig

        https://danielfett.de/de/tutorials/tutorial-regulare-ausdrucke/

        1 Reply Last reply Reply Quote 0
        • T
          tempestas last edited by

          Vielen Dank.

          Mein Fehler war offenbar, dass ich mich selbst gedanklich überlistet habe und nicht bedacht habe, dass IPs sehr whohl ja auch Bereiche wie 136… haben können. Bin halt nur BWLer ...

          Natürlich macht eine IP wie 013 nicht viel Sinn. Ich habe aber ignoriert, dass er sie einfach durchprobiert und wenns nicht gefunden wird, dann eben nicht, korrekt?

          Nachtrag: eine Frage habe ich doch noch:

          das [01]? bedeuted doch, dass der Block mit 0 oder 1 beginnen kann, aber nicht muss? Wieso nimmt man hier die 0 mit rein? Imho fängt eine IP doch nicht mit 0xx an, sondern wäre dann eben zweistellig, was wiederum durch die beiden folgenden Blöcke sichergestellt wird?

          Würde es nicht reichen, [1]? zu nehmen? Wenn nein, wieso nicht?

          Wo wir gerade so freundlich tippen, "on an unrelated side note":

          wie funktioniert der "coordinator" in Sonos 1.6? setState( sonos id.coordinator, [coordinator_ip mit unterstrichen] ) funktioniert bei mir nicht wie erhofft?

          1 Reply Last reply Reply Quote 0
          • BBTown
            BBTown last edited by

            @tempestas:

            wie funktioniert der "coordinator" in Sonos 1.6? setState( sonos id.coordinator, [coordinator_ip mit unterstrichen] ) funktioniert bei mir nicht wie erhofft? `
            Der "coordinator" ist der Gruppenleiter. Ist ein SONOS in einer Gruppe, dann steht hier das SONOS Gerät zu dessen Gruppe es zugefügt wurde. Ist es in keiner Gruppe, dann einfach die eigene Nummer eintragen.

            Es wird genau genommen nicht die IP des Gerätes eingetragen, sondern die Objektbezeichung (auch wenn diese sich wiederum bei der Anlage aus der IP-Adresse ableitet)

            Mein Tipp:

            Schau dir die Datenpunkte an und steuere die Gruppen über eine SONOS App. Du kannst eigentlich recht gut ablesen was mit den Datenpunkten geschieht je nachdem was Du in der App einstellst.

            Anmerkung:

            Falls ein Mod das hier lieber als eigenes Thema sehen möchte - bitte gern verschieben 🙂

            1 Reply Last reply Reply Quote 0
            • BBTown
              BBTown last edited by

              @tempestas:

              Würde es nicht reichen, [1]? zu nehmen? Wenn nein, wieso nicht? `
              Das würde ich auch annehmen; allerdings hat Pix viel mehr Erfahrung und vielleicht eine Erklärung 8-)

              1 Reply Last reply Reply Quote 0
              • T
                tempestas last edited by

                Danke Heiko,

                das habe ich getan. Ich bekomme es nur nicht hin, das coordinator Feld via Skript zu setzen. Daher meine Frage.

                ich meinte es so:

                setState(sonos.0.root.192_168_2_7.coordinator, 192_168_2_10);

                das geht irgendwie nicht?

                P.S: das Thema hatte ich schon separat aufgemacht, aber es gab leider keine Antworten. Und eben ist mir einfallen, dass du damals das Thema coordinator zumindest mit diskutiert hattest. Daher meine Frage an dich 🙂

                1 Reply Last reply Reply Quote 0
                • BBTown
                  BBTown last edited by

                  ist der Datenpunkt denn auf "write = true" eingestellt?

                  1 Reply Last reply Reply Quote 0
                  • T
                    tempestas last edited by

                    Werde ich prüfen 🙂 aktuell kein Zugriff

                    1 Reply Last reply Reply Quote 0
                    • BBTown
                      BBTown last edited by

                      Ich übergebe das ganze als string

                      Versuche es mal so:

                      setState("sonos.0.root.192_168_2_7.coordinator"/*coordinator Büro*/, '192_168_2_10')
                      
                      1 Reply Last reply Reply Quote 0
                      • P
                        pix last edited by

                        @BBTown:

                        @tempestas:

                        Würde es nicht reichen, [1]? zu nehmen? Wenn nein, wieso nicht? Das würde ich auch annehmen; allerdings hat Pix viel mehr Erfahrung und vielleicht eine Erklärung 8-)
                        Hab auch nicht mehr Erfahrung 8-)

                        [01]?[0-9][0-9]?
                        

                        Ich dachte an eine Adresse wie diese````
                        192_168_0_100

                        
                        Gruß
                        
                        Pix
                        1 Reply Last reply Reply Quote 0
                        • BBTown
                          BBTown last edited by

                          @pix:

                          Ich dachte an eine Adresse wie diese192_168_0_100 `
                          Welchen Teil daraus?

                          der letzte Block (100)?

                          oder der Vorletzte (0)?

                          würde das nicht so passen?

                          [012]?[0-9]?[0-9]
                          
                          1 Reply Last reply Reply Quote 0
                          • P
                            pix last edited by

                            @tempestas:

                            Würde es nicht reichen, [1]? zu nehmen? Wenn nein, wieso nicht? ` Ja, ist wohl richtig (ungetestet):

                            [01]?[0-9][0-9]?
                            

                            Die erste 0 kann wohl weg, um einen Block mit nur einer 0 abzudecken (wie hier 192.168.0.100).

                            [1]?[0-9][0-9]?
                            

                            Denn die einzelne 0 (hier im 3. Block) wird ja von der zweiten Gruppe [0-9] ohne Fragezeichen abgefangen (die Abfragen, die vorher mit 25 oder 2 beginnen kann man in diesem Falle ja eh überlesen).

                            Gruß

                            Pix

                            1 Reply Last reply Reply Quote 0
                            • T
                              tempestas last edited by

                              @pix:

                              @BBTown:

                              @tempestas:

                              Würde es nicht reichen, [1]? zu nehmen? Wenn nein, wieso nicht? Das würde ich auch annehmen; allerdings hat Pix viel mehr Erfahrung und vielleicht eine Erklärung 8-)
                              Hab auch nicht mehr Erfahrung 8-)

                              [01]?[0-9][0-9]?
                              

                              Ich dachte an eine Adresse wie diese````
                              192_168_0_100

                              
                              Gruß
                              
                              Pix `  
                              

                              Ahh ok. Klar, mittendrin kann eine 0 vorkommen alleinstehend. und du hast dann einfach aus ökonomischen Gründen überall das gleiche Abfrage Format genommen, korrekt?

                              Frage: wenn ich [1]? [0-9] [0-9]? hätte aber meine IO ist tatsächlich so wie oben````
                              192_168_0_100

                              
                              ****Nachtrag****: eigentlich müsste es doch "nach vorne" rutschen, oder? Pix' Version fragt ja auch nur den ersten Block ab, der zweite MUSS da sein, der dritte kann. wobei ja strengenommen dann bei einstelligen IP Teilen der zweite Block nach vorne rutscht auf den "hunderter Platz", oder? Die Abfrage könnte ja quasi heißen x 9 x, wobei x hier "N/A" sein soll.
                              
                              Wenn das aber so ist, dann sollte doch das hier funktionieren:
                              
                              [1]? [0-9]? [0-9] Damit MUSSS mindestens eine Stelle da sein zwischen 0 und 9, es können mehr sein und ich kann alles von 0 bis 199 abgreifen? Für die 200er und drüber sind ja die anderen Blöcke definiert.
                              
                              Spannendes Thema.
                              1 Reply Last reply Reply Quote 0
                              • P
                                pix last edited by

                                @tempestas:

                                Spannendes Thema. `
                                Stimmt, aber ich habe die zugeteilte Portion Gehirnschmalz schon aufgebraucht. Läuft ja :lol: Ehrlich gesagt, kann man auch einfach einen Platzhalter nehmen, denn die IP-Adresse wird schon vom Sonos-Adapter korrekt erstellt werden. Sollte das was nicht laufen, ist wohl erstmal die Einstellung im Sonos-Adapter falsch.

                                Gruß

                                Pix

                                1 Reply Last reply Reply Quote 0
                                • BBTown
                                  BBTown last edited by

                                  dann wären wir für jeden Block wieder hier 8-)

                                  [12]?[0-9]?[0-9]
                                  
                                  1 Reply Last reply Reply Quote 0
                                  • T
                                    tempestas last edited by

                                    Haha ja, läuft.

                                    Ich will ja immer nur lernen 🙂 Von dir und so manch anderem habe ich hier eh schon dermaßen profitiert… :idea: 😄

                                    1 Reply Last reply Reply Quote 0
                                    • T
                                      tempestas last edited by

                                      @BBTown:

                                      dann wären wir für jeden Block wieder hier 8-)

                                      [12]?[0-9]?[0-9]
                                      ```` `  
                                      

                                      Stimmt. Hier war gerade soviel Bewegung im Thread, habe ich übersehen. Das müsste nach meinem heute erlangente Verständnis alles abgreifen.

                                      1 Reply Last reply Reply Quote 0
                                      • First post
                                        Last post

                                      Support us

                                      ioBroker
                                      Community Adapters
                                      Donate

                                      435
                                      Online

                                      31.7k
                                      Users

                                      79.8k
                                      Topics

                                      1.3m
                                      Posts

                                      3
                                      17
                                      1186
                                      Loading More Posts
                                      • Oldest to Newest
                                      • Newest to Oldest
                                      • Most Votes
                                      Reply
                                      • Reply as topic
                                      Log in to reply
                                      Community
                                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                      The ioBroker Community 2014-2023
                                      logo