GELÖST: HTTPMOD: get01Expr mit Regex "Irgendein String außer dieser: ..."

Begonnen von Ulm32b, 20 Januar 2022, 18:17:20

Vorheriges Thema - Nächstes Thema

Ulm32b

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.

OdfFhem

@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"]]

Ulm32b

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
Außerdem ist das Know-How bereits im FTUI-Wiki hinterlegt: 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).

OdfFhem

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 ...

Ulm32b

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.