REGEX wird von fhem nicht richtig ausgewertet

Begonnen von Ralli, 02 Januar 2020, 08:26:51

Vorheriges Thema - Nächstes Thema

Ralli

Hallo zusammen,

folgendes REGEX wird m.E. von fhem nicht korrekt ausgewertet:


set .*(?<!^LNA)_Innensteck.*:FILTER=state=off:FILTER=TYPE=FBDECT on


Darauf sollte alles passen, was "_Innensteck" irgendwo im Suchstring hat, vom Typ FBDECT ist und ausgeschaltet ist außer dem Device, welches mit "LNA" anfängt. Laut REGEX-Tester ist das auch so. Fhem spricht jedoch mit diesem Suchstring gar kein Device an.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Ralli

Genau den nehme ich auch.

Auf LNA_Innensteckdose springt er nicht an, auf alle anderen (z.B. WZ_Innensteckdose oder BAD_Innensteckdose) schon. Und genau das ist das gewünschte Verhalten, aber fhem tut es nicht.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

CoolTux

Man sollte sowas nicht am Tablet testen. Hast Recht. Der regex101 geht in der Tat.
Hast Du mal versucht erstmal ohne Filter zu arbeiten um zu sehen das Dein RegEx in FHEM geht?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Ralli

Natürlich  :)

Ohne Filter gleiches (Fehl-)Verhalten.
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

CoolTux

Es scheint in der Tat an der RegEx in den () zu liegen. Genaueres kann ich aber nicht sagen. Muss ich erstmal in den Code schauen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

OdfFhem

Das "Problem" scheint an dem "<" festgemacht werden zu können; dies wird wohl erst ab Perl 5.30 "... as an experimental feature ..." unterstützt.

http://chris.photobooks.com/regex/ liefert

invalid regexp group


https://regex101.com/#p liefert je nach FLAVOR

The preceding token is not quantifiable


Einen reinen perl-Modus bietet keiner dieser Online-Tester ...


Anmerkung: ".*" als Einleitung für den regulären Ausdruck sollte überflüssig sein.

CoolTux

Zitat von: OdfFhem am 02 Januar 2020, 09:48:43
Das "Problem" scheint an dem "<" festgemacht werden zu können; dies wird wohl erst ab Perl 5.30 "... as an experimental feature ..." unterstützt.

http://chris.photobooks.com/regex/ liefert

invalid regexp group


https://regex101.com/#p liefert je nach FLAVOR

The preceding token is not quantifiable


Einen reinen perl-Modus bietet keiner dieser Online-Tester ...


Anmerkung: ".*" als Einleitung für den regulären Ausdruck sollte überflüssig sein.

Ich hatte das < Mal weg gelassen. Ging dennoch nicht
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Ralli

#8
Es geht konkret um die Funktion "negative lookbehind", die mit (?<!Ausschlusskriterium)REGEXP definiert wird. Gematched wird alles, auf was REGEXP passt und dem das Ausschlusskriterium nicht voransteht.

Zitat
Prior to Perl 5.30, it worked only for fixed-width lookbehind, but starting in that release, it can handle variable lengths from 1 to 255 characters as an experimental feature.

Wenn ich das richtig verstehe, kann Perl < 5.30 das bereits mit genau definierten Zeichenfolgen, was erst ab 5.30 geht, ist das Matchen auf Zeichenfolgen mit dynamischer Länge.


A zero-width negative lookbehind assertion. For example /(?<!bar)foo/ matches any occurrence of "foo" that does not follow "bar".


Quellen: https://perldoc.perl.org/perlre.html , http://www.drregex.com/2019/02/variable-length-lookbehinds-actually.html
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa

rudolfkoenig

#9
fhem> { "BAD_Innensteckdose" =~ m/.*(?<!^LNA)_Innensteck.*/ }
1
fhem> { "LNA_Innensteckdose" =~ m/.*(?<!^LNA)_Innensteck.*/ }

fhem> define LNA_Innensteckdose dummy
fhem> define WZ_Innensteckdose dummy
fhem> define BAD_Innensteckdose dummy
fhem> list .*(?<!^LNA)_Innensteck.*
fhem>


D.h. Regexp funktioniert innerhalb von perl gut (wozu verwendet man ueberhaupt Regexp-Tester?), aber devspec2array (und damit list, set, etc) es verbockt.

Und das wiederum liegt daran, dass devspec2array den Ausdruck auf Operatoren (=, <, >, etc) absucht mit
^(.*?)(=|!=|~|!~|<=|>=|<|>)(.*)$und damit den urspruenglichen Parameter in Name:.*(?,  Operator:<, und  Wert:!^LNA)_Innensteck.* aufteilt.

Ist wohl in diesem Fall falsch, mir faellt aber keine einfache Methode ein es zu fixen, ohne das Feature abzuschaffen.


Nachtrag: ein Workaround ist trivial:fhem> list NAME=.*(?<!^LNA)_Innensteck.*
BAD_Innensteckdose
WZ_Innensteckdose
fhem>

Ralli

Der Workaround klappt  :)

Danke, Rudi, und an alle anderen, die sich hier den Kopf zerbrochen haben!
Gruß,
Ralli

Proxmox 8.4 Cluster mit HP ED800G2i7, Intel NUC11TNHi7+NUC7i5BNH, virtualisiertes fhem 6.4 dev, virtualisierte RaspberryMatic (3.83.6.20250705) mit HB-RF-ETH 1.3.0 / RPI-RF-MOD, HM-LAN-GW (1.4.1) und HMW-GW, FRITZBOX 7490 (07.59), FBDECT, Siri und Alexa