[gelöst] regex um {min,max} erweitern

Begonnen von franky08, 16 April 2016, 10:50:54

Vorheriges Thema - Nächstes Thema

franky08

Hallo, ich habe mir für das Auslesen einer Wetterstation ein regex gebaut um auf positive Zahlen zu prüfen, dass funktioniert auch soweit. Um jetzt noch eine Prüfung auf einen min,max Wert einzubauen habe ich

=~ /^[+]?\d+(?:[\.,]\d+)?$/

mit {0,360} erweitert, dass funktioniert aber leider nicht, kann mich jemand erhellen?

P.S. der O'REILLY sagt: "{min,max} wird nicht von allen egrep-Versionen unterstützt"

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

justme1968

#1
mit dem {min,max} modifier wird nicht der wert auf auf die angegeben grenzen geprüft sondern die häufigkeit des vorkommens. d.h. du damit bestimmen wie viele stellen deine zahl hat aber nicht in welchem wertebereich sie sein darf.

das kannst du mit einer regex nur direkt über die regex abbilden. je nach wertebereich ist das dann mehr oder weniger lang und unübersichtlich.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

franky08

Danke Andre, dann hab ich das völlig falsch verstanden, steht aber auch darüber "Quantoren, Dinge die zählen". Siehst du eine Möglichkeit den Wertebereich von 0 bis 360 einzuschränken?

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

justme1968

#3
etwas in der art: ^([12]?\d?\d|3[0-5]\d|360)$

d.h.:
- alles mit 1, 2 oder 3 stellen bei der die erste stelle 1 oder 2 ist (0-299)
- oder drei stellen bei der die erste stelle gleich 3 ist und die zweite zwischen 0 und 5 (300-359)
- oder 360.

gruß
  andre 
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

franky08

Habe es gerade mal mit einem Regex Tester getestet, leider matcht es auch auf Werte über 360, siehe Screenshot:

VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

justme1968

die klammern waren noch falsch. ich hab es oben korrigiert.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

franky08

Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

franky08

Melde mich noch mal zurück, im Regex Tester ist das OK nur warum funktioniert das in der sub nicht?

{
my $kor = ReadingsVal("myWS1080","Wind-Dir",360);
if ($kor =~ /^([12]?\d?\d|3[0-5]\d|360)$/) {
fhem "setreading myWS1080 Wind_read_OK $kor";
}
}


matcht nie, habe das eben nur gemerkt, da die Windrichtung nicht mehr im Log auftaucht, etwas ratlos. Wenn ich mit meiner "allgemeinen" Regex
/^[+]?\d+(?:[\.,]\d+)?$/

auf Ziffern 0-9 und Kommastelle und positive Zahlen prüfe funktioniert es in der sub.
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

justme1968

was steht denn in dem reading wirklich drin?

eventuell musst du statt ^ und $ noch \D und \s erlauben.

wenn du sowieso auf perl ebene bist ist es eigentlich einfacher nur die zahl per regex zu extrahieren und den wertebereich per if zu prüfen.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

franky08

#9
In dem Reading steht, wenn alles OK ist, die Windrichtung also numerische von 0 bis 360. Ab und an spinnt aber der Sensor und liefert dann plötzlich negative Werte oder "--.-" und das provoziert dann im SVG Modul eine Warnung:
2016.04.10 22:10:41 1: PERL WARNING: Argument "--.-" isn't numeric in numeric gt (>) at ./FHEM/98_SVG.pm line 1483.
2016.04.10 22:10:42 1: PERL WARNING: Argument "--.-" isn't numeric in subtraction (-) at ./FHEM/98_SVG.pm line 1963.


VG
Frank

P.S. Umgebaut habe ich schon im notify über if das nur noch Werte bis 360 "durchgelassen" werden.

myWS1080:Wind-Dir.* {if (ReadingsVal("myWS1080","Wind-Dir",360)>360)
{fhem "setreading myWS1080 Wind_korrekt Fehler"}
else
{korrWind}
}


{korrWind} ist die sub in welcher die Regex steht
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...

franky08

#10
Somit reicht in der sub
/^[+]?\d+(?:[\.,]\d+)?$/
um negative Werte und nicht numerische Zeichen auszuschließen. Ich hoffe ich liege damit richtig.

2016-04-16_19:22:57 Regen_Monat_start Next: 19:30:56
2016-04-16_19:23:56 myWS1080 Regen_Tag: 0.3
2016-04-16_19:25:07 myWS1080 rel-Pressure: 999.6
2016-04-16_19:25:07 myWS1080 Wind_read_OK: 45.0
2016-04-16_19:25:07 myWS1080 Wind_speed_OK: 0
2016-04-16_19:28:56 myWS1080 Regen_Tag: 0.3


VG
Frank
Debian Wheezy auf ZBOX nano/ Debian Bullseye auf 2.ter ZBOX nano F2F an 2x RaspiB
22Zoll ViewSonic als Infodislay (WVC)
3xHMLAN mit vccu ,fhem5.8, CCU2,
ECMD an AVR-NET-IO mit DAC u. ADC an Junkers Stetigregelung, Siemens LOGO!8, JeeLink uvm...