FHEM Forum

FHEM => Frontends => TabletUI => Thema gestartet von: DocCyber am 26 März 2020, 19:00:50

Titel: RegEx für Label / data-part ?
Beitrag von: DocCyber am 26 März 2020, 19:00:50
EDIT 27.3.2020
Ich bin vielleicht nicht richtig verstanden worden. Deshalb formuliere ich meine Fragestellung anders. (s. unten)


Hallo zusammen

Es sei z.B. folgender Ausdruck:  EinWert:125
Wie kann ich   EinWert    bzw    125    (also ohne den Doppelpunkt!) in einem Label-Widget mittels data-part extrahieren?

Der Regex
[^:]*$
gibt mir im Online-Tester das richtige Ergebnis (125) aus, funktioniert aber nicht im folgenden Code. (Es wird nichts ausgegeben.)

<div class="label"
  data-device="dummy"
  data-part="[^:]*$">
</div>


Wie muss das richtig aussehen, damit es funktioniert?
Und wie müsste der Regex aussehen, wenn ich   EinWert   haben möchte?

Es wäre toll, wenn jemand helfen könnte. Vielen Dank vorab.

Titel: Antw:Regex für FTUI-Label - data-part
Beitrag von: Prof. Dr. Peter Henning am 27 März 2020, 07:03:38
https://regex101.com/

LG

pah
Titel: Antw:Regex für FTUI-Label - data-part
Beitrag von: DocCyber am 27 März 2020, 08:13:40
Dieser und ähnliche Links helfen mir bei meiner Fragestellung leider nicht weiter.
Titel: Antw:Anders formuliert: Regex und data-part
Beitrag von: DocCyber am 27 März 2020, 10:42:08
Hier also etwas anders formuliert.
Es geht nicht um den RegEx an sich, sondern um data-part.


TEST STRING:    EinWert:125
/[^:]*/  findet EinWert
/[^:]*$/ findet 125

so weit, so gut.
Das Label-Widget soll laut Wiki mit data-part und einem RegEx Teile eines Strings auslesen können.
Leider funktioniert das nicht.
<div class="label"
  data-device="dummy"
  data-part="[^:]*$">
</div>


So auch nicht:
<div class="label"
  data-device="dummy"
  data-part="/[^:]*$/">
</div>


Da der RegEx prinzipiell okay ist, muss es am Ausdrucksformat für data-part liegen.
Weiß jemand, was ich falsch mache? Oder funktioniert ein RegEx im Gegensatz zum Wiki hier doch nicht?
Titel: Antw:Anders formuliert: Regex und data-part
Beitrag von: yersinia am 27 März 2020, 11:36:49
mal geraten, du hast zwar einen Match aber keine Capturing group, funktioniert dies ggf:
<div class="label"
  data-get="dummy"
  data-part="/([^:]*)$/">
</div>
Titel: Antw:Anders formuliert: Regex und data-part
Beitrag von: DocCyber am 27 März 2020, 12:58:39
nein, das klappt leider auch nicht.
Titel: Antw:Anders formuliert: Regex und data-part
Beitrag von: yersinia am 27 März 2020, 13:34:21
Auch nicht ohne die /
<div class="label"
  data-get="dummy"
  data-part="([^:]*)$">
</div>


Möglicherweise kann data-part das auch nicht und evtl hilft dir data-substitution weiter.
Titel: Antw:Anders formuliert: Regex und data-part
Beitrag von: DocCyber am 27 März 2020, 14:17:15
Zitat von: yersinia am 27 März 2020, 13:34:21
Auch nicht ohne die /
<div class="label"
  data-get="dummy"
  data-part="([^:]*)$">
</div>

Hab ich noch nicht ausprobieren können.

Zitat
Möglicherweise kann data-part das auch nicht und evtl hilft dir data-substitution weiter.

Hiernach schon...
https://wiki.fhem.de/wiki/FTUI_Widget_Label (https://wiki.fhem.de/wiki/FTUI_Widget_Label)
Titel: Antw:Anders formuliert: Regex und data-part
Beitrag von: MKeY am 27 März 2020, 14:32:09
<div data-type="label" data-device="dummy" data-part=".*\:([0-9]*)*$"></div>
funktioniert in meiner Testumgebung (Frag aber nicht warum!)
Bitte auf das data-device="dummy" achten

hierher geklaut: https://stackoverflow.com/questions/32627864/regex-to-match-a-word-after-the-last-dot-in-a-string (https://stackoverflow.com/questions/32627864/regex-to-match-a-word-after-the-last-dot-in-a-string)
Titel: Antw:Anders formuliert: Regex und data-part
Beitrag von: DocCyber am 27 März 2020, 15:19:34
Ich war erneut nicht präzise genug - sorry.

Unabhängig vom Inhalt möchte ich den Teilstring vor bzw hinter dem Doppelpunkt haben, aber ohne den Doppelpunkt selbst. (vgl. Screenshots)
Du filterst in deinem Beispiel nach Zahlen.
Titel: Antw:Anders formuliert: Regex und data-part
Beitrag von: DocCyber am 27 März 2020, 15:33:32
Zitat von: MKeY am 27 März 2020, 14:32:09
Bitte auf das data-device="dummy" achten
Du hast selbstverständlich Recht. Ich hab's in echt richtig, nur im Beispiel war es falsch geschrieben.  :o
Titel: Antw:RegEx für Label / data-part ?
Beitrag von: Prof. Dr. Peter Henning am 27 März 2020, 18:07:32
 ::)
Noch einmal: Reguläre Ausdrücke muss man erst verstehen, und dann testen. Insofern auch noch einmal: https://regex101.com/ gibt gute Fehlerhinweise.

pah
Titel: Antw:RegEx für Label / data-part ?
Beitrag von: MKeY am 27 März 2020, 19:12:43
wenn du eh ggf beide Werte möchtest, warum machst du im Device kein userreading mit Perl?

Teil1:.* {my @split = split ':', ReadingsVal($name, "state", ""); my $ret = $split[0]; return $ret;},
Teil2:.* {my @split = split ':', ReadingsVal($name, "state", ""); my $ret = $split[1]; return $ret;}
Titel: Antw:RegEx für Label / data-part ?
Beitrag von: DocCyber am 27 März 2020, 19:42:11
Ja, es gibt auch andere Lösungen,  natürlich, und ich verwende eine davon.
Aber es geht mir darum, es mit Regex zu machen,  weil es die eleganteste Lösung ist.

Es kann doch nicht sein, dass man einen definitiv richtigen regulären Ausdruck nicht in data-part eingebaut bekommt.

Titel: Antw:RegEx für Label / data-part ?
Beitrag von: DocCyber am 27 März 2020, 19:49:35
Zitat von: Prof. Dr. Peter Henning am 27 März 2020, 18:07:32
Nochmal https://regex101.com/ gibt gute Fehlerhinweise.

Danke für die Antwort.
Aber ebenfalls nochmal: ich kenne die Seite. Sie ist gut,  aber sie hilft mir bei dieser Fragestellung nicht, denn ich habe ja bereits die passenden Regex.
Oder habe ich etwas übersehen?
Titel: Antw:Anders formuliert: Regex und data-part
Beitrag von: yersinia am 28 März 2020, 10:43:57
Zitat von: DocCyber am 27 März 2020, 19:49:35
Aber ebenfalls nochmal: ich kenne die Seite. Sie ist gut,  aber sie hilft mir bei dieser Fragestellung nicht, denn ich habe ja bereits die passenden Regex.
Oder habe ich etwas übersehen?

Schau doch mal im Code, wie das widget das behandelt. Ausgangslage ist, dass du eine aktuelle FTUI Version hast und die Version auf github eq deiner ist. Wenn ja, wird data-part so verarbeitet:
var val = ftui.getPart(value, elem.data('part'));
https://github.com/knowthelist/fhem-tablet-ui/blob/master/www/tablet/js/widget_label.js (https://github.com/knowthelist/fhem-tablet-ui/blob/master/www/tablet/js/widget_label.js)

Die Funktion getPart verarbeitet das dann so:
var matches = value.match(new RegExp('^' + part + '$'));
https://github.com/knowthelist/fhem-tablet-ui/blob/master/www/tablet/js/fhem-tablet-ui.js (https://github.com/knowthelist/fhem-tablet-ui/blob/master/www/tablet/js/fhem-tablet-ui.js)

Ich verstehe das so, dass du dein RegEx also ohne ^ und $ bauen musst, in etwa so:
[:]([\w]*)
<div class="label"
  data-get="dummy"
  data-part="[:]([\w]*)">
</div>
Titel: Antw:RegEx für Label / data-part ?
Beitrag von: DocCyber am 28 März 2020, 13:34:33
Hallo Yersinia,

Quellcode ansehen stand schon auf dem Programm. Du warst schneller.  :)
Ja, ich habe dieselbe Version.

Derzeit verstehe ich aber noch nicht den Sinn dahinter, dass der JS-Code den übergebenen Regex grundsätzlich mit ^ und $ auffüttert. Damit sage ich nicht, dass das sinnlos ist.
Das 'Problem' ist: Einer meiner beiden funktionierenden Regex braucht ein $ am Ende, der andere nicht.

Ich muss mir das genauer ansehen.