FHEM Forum

FHEM => Sonstiges => Thema gestartet von: Ulm32b am 20 Januar 2022, 18:17:20

Titel: GELÖST: HTTPMOD: get01Expr mit Regex "Irgendein String außer dieser: ..."
Beitrag von: Ulm32b am 20 Januar 2022, 18:17:20
Im Kern geht es hier um eine Regex-Challenge:

Für das Widget "Departure" in FTUI holt man sich per HTTPMOD die Daten zu Abfahrtszeiten und erhält z.B. folgendes Ergebnis:
[["5","Ludwigsfeld","194"],["5","Wiley","224"],["5","Universität","232"],["5","Universität","247"],["5","Ludwigsfeld","254"],["5","Universität","262"],["5","Universität","277"],["5","Ludwigsfeld","284"],["5","Universität","292"],["5","Universität","307"],["5","Wiley","311"],["5","Universität","322"],["5","Ludwigsfeld","331"],["5","Universität","332"],["E","Hauptbahnhof","336"]]

Es kam der Wunsch auf, uninteressante Relationen aus dieser Liste zu entfernen.
Dies gelingt durch
get01Expr {$val=~s/\[[^\[]*("Ludwigsfeld",|"Wiley",)[^\]]*\],?//g;; $val =~s/\],\]/]]/;; return $val;;}
In diesem Fall werden die Ziele "Ludwigsfeld" und "Wiley" sowie deren Liniennummern und Abfahrtszeiten aus der Liste entfernt. Man erhält also das für das FTUI-Widget brauchbare Ergebnis
[["5","Universität","232"],["5","Universität","247"],["5","Universität","262"],["5","Universität","277"],["5","Universität","292"],["5","Universität","307"],["5","Universität","322"],["5","Universität","332"],["E","Hauptbahnhof","336"]]

Mit etwas Gehirnjogging in Regex versteht man, dass dabei die unerwünschten Daten gesucht und durch einen Leerstring ersetzt werden. Das funktioniert einwandfrei. :)

Manchmal ist es praktischer, nicht eine Negativ-Liste (= zu streichende Einträge), sondern eine Positiv-Liste (= gewünschte Einträge) anzugeben. Meine Idee hierzu war, im obigen Code statt ("Ludwigsfeld",|"Wiley",) einen Regex-Ausdruck einzubauen für "irgendein String der Form "xyz", der nicht enthält: ("Ludwigsfeld",|"Wiley",). Die so gefundenen Einträge werden dann gelöscht. Guter Plan, dachte ich mir. Aber klappen muss er.

Trotz mancher Versuche und Recherchen habe ich es nicht geschafft, die richtige Regex zu formulieren. :-\ Über einen Stupser würde ich mich sehr freuen.
Titel: Antw:HTTPMOD: get01Expr mit Regex "Irgendein String außer dieser: ..."
Beitrag von: OdfFhem am 20 Januar 2022, 21:00:56
@Ulm32b

Nur noch mal zur Sicherheit
... Negativ-Liste heisst: Du willst angeben, welche Verbindungen entfernt werden sollen ... quasi erledigt
... Positiv-Liste heisst: Du willst angeben, welche Verbindungen erhalten bleiben sollen


$val = "[".join(',',$val =~ /(\[[^\[]*(?:"Ludwigsfeld"|"Hauptbahnhof")[^\]]*\])/g)."]";

[["5","Ludwigsfeld","194"],["5","Ludwigsfeld","254"],["5","Ludwigsfeld","284"],["5","Ludwigsfeld","331"],["E","Hauptbahnhof","336"]]



$val = "[".join(',',$val =~ /(\[[^\[]*(?:"[^\]]*ley"|"Haupt[^\]]*")[^\]]*\])/g)."]";

[["5","Wiley","224"],["5","Wiley","311"],["E","Hauptbahnhof","336"]]



$val = "[".join(',',$val =~ /(\[[^\[]*(?:"23\d"|"33\d")[^\]]*\])/g)."]";

[["5","Universität","232"],["5","Ludwigsfeld","331"],["5","Universität","332"],["E","Hauptbahnhof","336"]]
Titel: GELÖST:HTTPMOD: get01Expr mit Regex "Irgendein String außer dieser: ..."
Beitrag von: Ulm32b am 21 Januar 2022, 01:04:55
Zitat von: OdfFhem am 20 Januar 2022, 21:00:56
@Ulm32b

Nur noch mal zur Sicherheit
... Negativ-Liste heisst: Du willst angeben, welche Verbindungen entfernt werden sollen ... quasi erledigt
... Positiv-Liste heisst: Du willst angeben, welche Verbindungen erhalten bleiben sollen

...
:) :) :) Super. Vielen, vielen Dank.
Ich habe das Ergebnis gleich an anderer Stelle auf eine zugehörige Anfrage eingestellt: https://forum.fhem.de/index.php/topic,48255.msg1202284.html#msg1202284 (https://forum.fhem.de/index.php/topic,48255.msg1202284.html#msg1202284)
Außerdem ist das Know-How bereits im FTUI-Wiki hinterlegt: https://wiki.fhem.de/wiki/FTUI_Widget_Departure (https://wiki.fhem.de/wiki/FTUI_Widget_Departure)

Das Filtern nach Zahlen habe ich nicht übernommen, denn die hintere Zahl ist nicht die Liniennummer, sondern die Zeit bis zur nächsten Abfahrt. Die Linie steht vorne und muss auch nicht unbedingt eine Zahl sein (z.B. Nachtbus N1).
Titel: Antw:GELÖST:HTTPMOD: get01Expr mit Regex "Irgendein String außer dieser: ..."
Beitrag von: OdfFhem am 21 Januar 2022, 04:08:38
Zitat von: Ulm32b am 21 Januar 2022, 01:04:55
... die hintere Zahl ist nicht die Liniennummer, sondern die Zeit bis zur nächsten Abfahrt. Die Linie steht vorne und muss auch nicht unbedingt eine Zahl sein (z.B. Nachtbus N1).

War schon klar, bot bei den Beispieldaten nur mehr Spielraum für einen regulären Ausdruck.

Nachträglich aufgefallen ist mir, dass man doch besser noch das nachfolgende Komma in die innere Klammer aufnimmt. Ansonsten sorgen Abfahrtszeiten, die einer gewünschten Liniennummer entsprechen, für falsche Ergebnisse ...
Titel: GELÖST:HTTPMOD: get01Expr mit Regex "Irgendein String außer dieser: ..."
Beitrag von: Ulm32b am 21 Januar 2022, 22:11:18
Zitat von: OdfFhem am 21 Januar 2022, 04:08:38
Nachträglich aufgefallen ist mir, dass man doch besser noch das nachfolgende Komma in die innere Klammer aufnimmt. Ansonsten sorgen Abfahrtszeiten, die einer gewünschten Liniennummer entsprechen, für falsche Ergebnisse ...
Im Wiki sind jetzt Versionen hinterlegt, die zuverlässig (auch gemischt) mit Zielen und Linien umzugehen wissen.