[gelöst] Regex Problem mit mehreren Treffern

Begonnen von FrauMeier, 16 Januar 2022, 19:17:40

Vorheriges Thema - Nächstes Thema

FrauMeier

Moin,

Ich will von der Radioplayer webseite Titel und Interpret auslesen. Das läuft in HTTPMOD aber noch nicht rund weil ich über Tabellen die Parameter übergebe und so die Regex kompliziert wird. Das bestmögliche das ich hinbekomme gibt mir zwei Treffer zurück, ausgewertet wird nur der erste, und wie soll es anders sein: ich brauche den zweiten.
Gibt es ein Funktion bei der ich nur den zweiten Treffer der Regex auswerten kann?

Suchtext:
callback({"responseStatus":"SUCCESS","total":2,"results":{"72":[{"type":"SI","rpId":"72","serviceName":"RADIO 21 Hannover","name":"","artistName":"","song":false,"description":"RADIO 21 – das ist bester ROCK N' POP aus den 70ern, 80er, 90ern, 00ern und von heute. Ehrliche, echte und handgemachte Musik von den Giganten des Rock: AC/DC, Pink Floyd,...","imageUrl":"https://assets.radioplayer.de/stationimages/72_programme_image.png","startTime":"","stopTime":""},{"type":"PE_E","rpId":"72","serviceName":"RADIO 21 Hannover","name":"Enjoy The Silence","artistName":"Depeche Mode","song":true,"description":"","imageUrl":"https://assets.radioplayer.org/track-visuals/600/600/8538e728-ca0b-4321-b7e5-cff6565dd4c0_600_600.jpg","startTime":"1642108476","stopTime":"1642108701"}]}})

und meine Titel Regex:(?<=\,"name":)(.*?)(?=\","artistName)

Ich nutze Lookaround zum finden der Infos, aber auf der Seite ist alles doppelt und es ist alles in einer Zeile.

Ich hab auch versucht das lookaround in ein anderes lookaround eizubinden, aber das funktioniert nicht (k.a. warum). Wenn ich das lookbehind ausweite bis es eindeutig wird, dann funktioniert es zwas mit einer seite, aber ich muss mit der gleichen Regex unterschiedliche URL absuchen können, daher ist das keine option.

Hat jemand eine Idee wie ich hier weiterkomme?

JensS

Hab's selbst noch nicht gebraucht aber in HTTPMOD gibt es das Attribut "enforceGoodReadingNames 1", welches dir alle Key:Value-Paare automatisch in extra Readings schreibt.

Gruß Jens
Debian auf APU2C4, HM-CFG-USB2, SIGNALduino, HM-ES-PMSw1-Pl, TFA 30.3121, TFA 30.3125, ITS-150, PIR-5000, configurable Firmata USB & LAN, 1-wire: DS-18B20, DS-18S20, DS-2408, DS-2413, diverse I2C-Komponenten, zigbee2mqtt, ESPEasy etc.

betateilchen

Zitat von: JensS am 16 Januar 2022, 20:57:19
Hab's selbst noch nicht gebraucht aber in HTTPMOD gibt es d...

stimmt, aber was hat das mit der gestellten Frage zu tun?

Zitat von: FrauMeier am 16 Januar 2022, 19:17:40
Ich will von der Radioplayer webseite Titel und Interpret auslesen. Das läuft in HTTPMOD aber noch nicht rund
...
Hat jemand eine Idee wie ich hier weiterkomme?

Dein Antwortstring ist doch fast reinrassiges JSON - warum quälst Du Dich dann mit HTTPMOD ab, anstatt einfach das JSON zu verarbeiten?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Jamo

gehe mal auf https://regex101.com/
Oben in die Zeile, bei Regular Expression, trägst Du folgendes ein:
callback.*,"name":"(.*?)","artistName":"(.*?)","song"
Unten, im grossen Feld Test String trägst Du deinen suchtext ein:
callback({"responseStatus":"SUCCESS","total":2,"results":{"72":[{"type":"SI","rpId":"72","serviceName":"RADIO 21 Hannover","name":"","artistName":"","song":false,"description":"RADIO 21 – das ist bester ROCK N' POP aus den 70ern, 80er, 90ern, 00ern und von heute. Ehrliche, echte und handgemachte Musik von den Giganten des Rock: AC/DC, Pink Floyd,...","imageUrl":"https://assets.radioplayer.de/stationimages/72_programme_image.png","startTime":"","stopTime":""},{"type":"PE_E","rpId":"72","serviceName":"RADIO 21 Hannover","name":"Enjoy The Silence","artistName":"Depeche Mode","song":true,"description":"","imageUrl":"https://assets.radioplayer.org/track-visuals/600/600/8538e728-ca0b-4321-b7e5-cff6565dd4c0_600_600.jpg","startTime":"1642108476","stopTime":"1642108701"}]}})
Auf der Rechten Seite bekommst Du dann die gewünschten Ergebnisse in Group 1 und Group 2.
Das musst Du jetzt nur noch in dein HTTPMOD übertragen.
Bullseye auf iNUC, Homematic + HMIP(UART/HMUSB), Debmatic, HUEBridge, Zigbee/ConbeeII, FB, Alexa (fhem-lazy), Livetracking, LaCrosse JeeLink, LoRaWan / TTN / Chirpstack

FrauMeier

Danke für die Antworten.

@JensS enforceGoodReadingNames 1 hat  leider nichts geändert.

@ betateilchen: im JSON bin ich noch weniger zu hause.

@ Jamo
callback.*,"name":"(.*?)","artistName":"(.*?)","song"
Das ist ein Volltreffer, und so schlicht. Ich hatte da viel zu Kompliziert angefangen. Vielen Dank!

Noch ein paar Details für Nachahmer: Die Ergebnisse der beiden capture Groups werden im Webintereface nicht angezeigt, aber intern mit index versehen und abrufbar. Wenn Reading1 Musik heißt, dann steht der Titel in "Musik-1" und der Künstler in "Musik-2".