NEWS
Frage zu RegEx am Beispiel von Pix
-
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
-
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östAls 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/
-
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?
-
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
-
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-) -
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
-
ist der Datenpunkt denn auf "write = true" eingestellt?
-
Werde ich prüfen aktuell kein Zugriff
-
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')
-
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_100Gruß Pix
-
@pix:Ich dachte an eine Adresse wie diese
192_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]
-
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
-
@pix: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_100Gruß 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.
-
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
-
dann wären wir für jeden Block wieder hier 8-)
[12]?[0-9]?[0-9]
-
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:
-
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.