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.
https://regex101.com/
LG
pah
Dieser und ähnliche Links helfen mir bei meiner Fragestellung leider nicht weiter.
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?
mal geraten, du hast zwar einen Match aber keine Capturing group, funktioniert dies ggf:
<div class="label"
data-get="dummy"
data-part="/([^:]*)$/">
</div>
nein, das klappt leider auch nicht.
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.
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)
<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)
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.
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
::)
Noch einmal: Reguläre Ausdrücke muss man erst verstehen, und dann testen. Insofern auch noch einmal: https://regex101.com/ gibt gute Fehlerhinweise.
pah
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;}
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.
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?
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>
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.