FHEM Forum

FHEM => Codeschnipsel => Thema gestartet von: Bjoernar am 23 Mai 2021, 15:27:55

Titel: regex ... ich bin zu blöd dafür
Beitrag von: Bjoernar am 23 Mai 2021, 15:27:55
Hallo,

ich hoffe es kann mir jemand helfen den regex Befehl entsprechend anzupassen, ich bin dafür einfach zu blöd ;-)

Ich habe folgenden String und den Fetten Bereich hätte ich gerne:

WLAN-Verbindung: gut; Browser-Ladegeschwindigkeit: gut

Damit klappt das auch soweit:
(?s)WLAN-Verbindung:.*?(\w+)
(?s)Browser-Ladegeschwindigkeit:.*?(\w+)

Jedoch steht da nicht immer gut, sondern z.B. auch da:
WLAN-Verbindung: noch o.k.; Browser-Ladegeschwindigkeit: gut

(?s)WLAN-Verbindung:.*?(\w+) beendet dann entsprechend bei dem Leerzeichen hinter "noch"

Wie kann ich das so ändern das der erste String bis zum ; geht und der zweite einfach bis zu ende?

Meine Fähigkeiten bei regex reichen dafür leider nicht aus.

Danke schon mal für die Hilfe.
Gruß
Björnar
Titel: Antw:regex ... ich bin zu blöd dafür
Beitrag von: betateilchen am 23 Mai 2021, 16:31:55
:.(.*);.*:.(.*)$
Titel: Antw:regex ... ich bin zu blöd dafür
Beitrag von: Benni am 23 Mai 2021, 16:32:13
https://regexr.com/5th42

Sorry, es ging ja nur um die fetten Anteile:

Dann so:
https://regexr.com/5th4b

sowas?

gb#
Titel: Antw:regex ... ich bin zu blöd dafür
Beitrag von: Bjoernar am 23 Mai 2021, 17:29:26
Danke schon mal für die Antwort.
Kann ich leider so nicht umsetzen.

Mit "(?s)(?s)WLAN-Verbindung:.*?(\w+)" suche ich ja nach dem String "WLAN-Verbindung:" und nehme dann das Wort dahinter.


Also müsste der ".*?(\w+)" Teil irgendwie angepasst werden.

Titel: Antw:regex ... ich bin zu blöd dafür
Beitrag von: TomLee am 23 Mai 2021, 17:39:32
Schreib doch einfach WLAN-Verbindung vor den Vorschlag von oben, oder kannst es damit auch nicht umsetzen ?

WLAN-Verbindung:.(.*);.*:.(.*)$
Titel: Antw:regex ... ich bin zu blöd dafür
Beitrag von: Bjoernar am 23 Mai 2021, 17:59:11
das habe ich ja versucht, aber das funktioniert dann auch nicht.
Was regex angeht reicht es bei mir wohl wirklich nur zu copy and paste.
Titel: Antw:regex ... ich bin zu blöd dafür
Beitrag von: Otto123 am 23 Mai 2021, 18:34:05
Bennis Vorschlag passt doch auf Deinen String? Auch mit deinem Text
WLAN-Verbindung:\s(.*);.*:\s(.*)
Warum bestehts Du auf den (?s) - in welchem Kontext verwendest Du das regEx denn? (?s) ist ein mode modfier  ???
Titel: Antw:regex ... ich bin zu blöd dafür
Beitrag von: Bjoernar am 23 Mai 2021, 18:50:46
Bestehe ich überhaupt nicht drauf.
Ich lese aus der Seite meines Weathermans mehrere Werte aus die nicht über CCU kommen.
Das klappt mit dem String halt solange das Wort kein Leerzeichen hat.

Wie auch immer das dann gemacht werden muss.
Wenn ich das richtig verstehe Sicht mein regex nach dem Teig und nimmt einfach das Wort was dahinter steht.

Ob das auch anders geht keine Ahnung

Auf der Seite werden halt viele Werte dargestellt.
Titel: Antw:regex ... ich bin zu blöd dafür
Beitrag von: KyleK am 24 Mai 2021, 11:22:20
Ich würde das so schreiben:

WLAN-Verbindung:\s(.+?);\sBrowser-Ladegeschwindigkeit:\s(.+)$


https://regex101.com/r/8rjPoi/1

\w ist ein Shorthand für [A-Za-z0-9_], also mehr oder weniger alle "Wörter". Da is aber kein Punkt dabei, und keine Leerzeichen.
\w+ macht daher meiner Meinung nach nicht viel Sinn.

*EDIT:* Das geht auch, und ist laut regex101.com sogar effizienter:

(?s)WLAN-Verbindung:.*?([\w\s.]+)
Titel: Antw:regex ... ich bin zu blöd dafür
Beitrag von: betateilchen am 24 Mai 2021, 14:54:02
Zitat von: Bjoernar am 23 Mai 2021, 17:29:26
Kann ich leider so nicht umsetzen.

Meine oben vorgeschlagene regex

:.(.*);.*:.(.*)$

wurde sowohl mit

WLAN-Verbindung: gut; Browser-Ladegeschwindigkeit: gut

als auch mit

WLAN-Verbindung: noch o.k.; Browser-Ladegeschwindigkeit: gut

getestet und lieferte in beiden Fällen das gewünschte Ergebnis in den Gruppen 1 und 2
Titel: Antw:regex ... ich bin zu blöd dafür
Beitrag von: Bjoernar am 02 Juni 2021, 10:26:34
Danke für die Hilfe.

das Klappt entsprechend:

(?s)WLAN-Verbindung: .*?([\w\s.]+)