Hauptmenü

regex - Negation

Begonnen von Guest, 07 November 2011, 09:19:24

Vorheriges Thema - Nächstes Thema

Guest

Originally posted by: <email address deleted>

Hi,

ich habe mir ein notify gebastelt, welches bei mir bei leerer Batterie
eines FHT eine Mail schickt. Derzeit nutze ich

.*:[bB]attery.*[lL]ow

als Regex - viel lieber wäre mir aber, eine Mail zu bekommen, wenn NICHT
ok kommt.

Probiert habe ich

.*:[bB]attery.*[^o][^k].*
.*:[bB]attery.*(?!ok).*

- beide matchen aber irgendwie immer. Kann da jemand helfen bzw. hat
eine Idee?

Gruß

marte

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

rudolfkoenig

                                                   

> als Regex - viel lieber wäre mir aber, eine Mail zu bekommen, wenn
> NICHT ok kommt.

Ich glaube das ist ein Problem (anders formuliert: es geht nicht), und es ist
einfacher alle Module nach Batterie durchzusuchen (idealerweise steht das im
commandref.html, "Generated events" Abschnitt), und die moeglichen Varianten
einzeln aufzuzaehlen, z.Bsp: .*:(Battery:low|Battery:missing|...)


> .*:[bB]attery.*[^o][^k].*

Fuer das Beispiel "battery:ok" entspricht das erste .* dem Leersting, danach
stimmt dass : kein o ist, und o kein k. Das letzte .* matcht den k.


> .*:[bB]attery.*(?!ok).*

Aehnlich hier: ".*(?!ok)" wird dem Leerstring zugewiesen und der Rest dem
letzten .*

Wenn man .* am Schluss entfernt, muessten beide funktionieren, es sei denn im
Event kommt ok nicht zum Schluss.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Hi,

danke für die (durchaus einleuchtende) Antwort. Leider klappts trotzdem
nicht:

   .*:[bB]attery.*(?!ok) und
   .*:[bB]attery.*(?!ok)$

triggern auf

   FHT_Bad battery: ok
sowie auf
   FHT_Wohnzimmer battery: low

während

   .*:[bB]attery.*[^o][^k]

gar nicht triggert. Hast Du da noch eine Idee? Bzw. erwähntest Du ja zu
Beginn Deiner antwort, dass es nicht geht. Warum nicht?

Gruß

marte


Am 07.11.2011 10:32, schrieb Rudolf Koenig:
>> als Regex - viel lieber wäre mir aber, eine Mail zu bekommen, wenn
>> NICHT ok kommt.
>
> Ich glaube das ist ein Problem (anders formuliert: es geht nicht), und es ist
> einfacher alle Module nach Batterie durchzusuchen (idealerweise steht das im
> commandref.html, "Generated events" Abschnitt), und die moeglichen Varianten
> einzeln aufzuzaehlen, z.Bsp: .*:(Battery:low|Battery:missing|...)
>
>
>> .*:[bB]attery.*[^o][^k].*
>
> Fuer das Beispiel "battery:ok" entspricht das erste .* dem Leersting, danach
> stimmt dass : kein o ist, und o kein k. Das letzte .* matcht den k.
>
>
>> .*:[bB]attery.*(?!ok).*
>
> Aehnlich hier: ".*(?!ok)" wird dem Leerstring zugewiesen und der Rest dem
> letzten .*
>
> Wenn man .* am Schluss entfernt, muessten beide funktionieren, es sei denn im
> Event kommt ok nicht zum Schluss.
>

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

Guest

Originally posted by: <email address deleted>

Hey,

You can give a try with Regex-Coach program:

http://weitz.de/regex-coach/

It's a cool Windows/Linux regex tester/developer app..

Szabi

2011. 11. 9, szerda keltezéssel 13.05-kor marte ezt írta:
> Hi,
>
> danke für die (durchaus einleuchtende) Antwort. Leider klappts trotzdem
> nicht:
>
>    .*:[bB]attery.*(?!ok) und
>    .*:[bB]attery.*(?!ok)$
>
> triggern auf
>
>    FHT_Bad battery: ok
> sowie auf
>    FHT_Wohnzimmer battery: low
>
> während
>
>    .*:[bB]attery.*[^o][^k]
>
> gar nicht triggert. Hast Du da noch eine Idee? Bzw. erwähntest Du ja zu
> Beginn Deiner antwort, dass es nicht geht. Warum nicht?
>
> Gruß
>
> marte
>
>
> Am 07.11.2011 10:32, schrieb Rudolf Koenig:
> >> als Regex - viel lieber wäre mir aber, eine Mail zu bekommen, wenn
> >> NICHT ok kommt.
> >
> > Ich glaube das ist ein Problem (anders formuliert: es geht nicht), und es ist
> > einfacher alle Module nach Batterie durchzusuchen (idealerweise steht das im
> > commandref.html, "Generated events" Abschnitt), und die moeglichen Varianten
> > einzeln aufzuzaehlen, z.Bsp: .*:(Battery:low|Battery:missing|...)
> >
> >
> >> .*:[bB]attery.*[^o][^k].*
> >
> > Fuer das Beispiel "battery:ok" entspricht das erste .* dem Leersting, danach
> > stimmt dass : kein o ist, und o kein k. Das letzte .* matcht den k.
> >
> >
> >> .*:[bB]attery.*(?!ok).*
> >
> > Aehnlich hier: ".*(?!ok)" wird dem Leerstring zugewiesen und der Rest dem
> > letzten .*
> >
> > Wenn man .* am Schluss entfernt, muessten beide funktionieren, es sei denn im
> > Event kommt ok nicht zum Schluss.
> >
>


--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

rudolfkoenig

                                                   

> Hast Du da noch eine Idee?

Ich meine jetzt (?!...) besser zu verstehen: diesen Konstrukt kann man nicht
mit einem direkt angrenzenden .* erweitern: .*(?!ok) liefert sogar bei "ok" wahr,
weil das .* den String ok fuer sich einnimmt, das Nichts danach bleibt fuer
(?!ok), aber das ist kein Widerspruch.



> Bzw. erwähntest Du ja zu Beginn Deiner antwort, dass es nicht geht. Warum nicht?

Regexp-matcher sind halt nicht fuer Negation gebaut, die allgemeine Einstellung
dafuer ist dass sowas in der Programmlogik ausserhalb zu behandeln sei: in perl
verwendet man also statt "string =~ m//" dann "string !~ m/".

Der Anwender ist aufgeschmissen, wenn man bei einem Programm nur den regexp
frei waehlen kann, und das Programm bietet nur (wie das notify hier) die eine
Pruefung an.

Mit relativ wenig Aufwand koennte man ein Attribut "negateRegexp" einfuehren:
wenn das auch sonstwer fuer sinnvoll haelt, dann kann ich es einbauen.

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com

rudolfkoenig

                                                   

> Mit relativ wenig Aufwand koennte man ein Attribut "negateRegexp" einfuehren:
> wenn das auch sonstwer fuer sinnvoll haelt, dann kann ich es einbauen.

Andererseits kannst Du das auch einfach selbst bauen:

notify xxx .*:[Bb]attery.* { if("%" !~ m/ok/) { ...  } }

--
To unsubscribe from this group, send email to
fhem-users+unsubscribe@googlegroups.com