(gelöst) RegEx: Text ausschließen

Begonnen von heikoh81, 14 März 2018, 20:42:07

Vorheriges Thema - Nächstes Thema

heikoh81

Hallo,

ich habe Dummies der Art
Alexa*
sowie Checkboxen der Art
Alexa*_ChkBox.

In einem Filelog möchte ich alle state-Veränderunen der Dummies, aber NICHT  der Checkboxen loggen.

Ich habe experimentiert mit (!?ChkBox), aber das hat nie so richtig funktioniert.
So wird alles geloggt:

./log/AlexaAlleDummiesMitRegex.log ^Alexa.*


Wie müsste ich den RegEx anpassen, damit alle devices mit _ChkBox nicht enthalten sind.

Viele Grüße,
Heiko

sumsum


Christoph Morrison

Zitat von: sumsum am 14 März 2018, 22:28:46
Alexa.+(?<!_ChkBox)$

Das schreibst du besser als negative lookahead, anstelle eines negative lookbehind. Das spart dem RegEx-Parser ungefähr 50% der Arbeitsschritte.

Alexa.+(?!_ChkBox)

sumsum

OK, Lerne gerne dazu.  :)
Laut https://regex101.com/ ergibt für deine regex Alexa_abc_ChkBox ein Match.
Das ist aber nicht gewollt.

sumsum

ich nochmal. Mit einer Mischung aus negative lookahead und non-capturing group klappt es aber.
Alexa(?!.*(?:_ChkBox))

Wie Christoph richtig sagt braucht er die Hälfte der Schritte.

Habe da nie so richtig drauf geachtet.   ;D

heikoh81

Zitat von: sumsum am 15 März 2018, 00:19:09
Alexa(?!.*(?:_ChkBox))

Genial, danke euch allen für die Erarbeitung der Lösung.
Konnte es mit regex101 auch (so einigermaßen) nachvollziehen.

Ich werde die Performance in FHEM im Auge behalten und hoffe, dass dieses Regex nicht zu viel CPU-Last auf meinem Raspi3 erzeugt...

KernSani

Schreibst du dann bitte noch [Gelöst] vor das Subject des ersten Posts?
Danke!


Kurz, weil mobil...
RasPi: RFXTRX, HM, zigbee2mqtt, mySensors, JeeLink, miLight, squeezbox, Alexa, Siri, ...

heikoh81

#7
Ich kann das Topic noch nicht schließen, war zu voreilig.

Meine Dummies lauten immer:
AlexaLichtCouch
AlexaLichtCouch_ChkBox

Mit

./log/AlexaAlleDummiesMitRegex.log Alexa(?!.*(?:_ChkBox))

wird leider gar nichts mehr geloggt.
regex101 markiert in "AlexaLichtCouch" auch nur "Alexa", zeigt aber "full match" an.
Liegt es vielleicht daran?

Mit der filelog-Definition

./log/AlexaAlleDummiesMitRegex.log ^Alexa.*

wird die Aktivität von beiden Dummies geloggt.

Viele Grüße,
Heiko

sumsum

Hallo Heiko,

im Event Monitor kannst du sehen, dass hinter dem device name ja noch was kommt
zum Beispiel:
... dummy AlexaLichtCouch_ChkBox off
... dummy AlexaLichtCouch off

Die regEx sollte es tun:

Alexa(?!.*(?:_ChkBox)).+

heikoh81

Zitat von: sumsum am 17 März 2018, 10:44:27
Die regEx sollte es tun:

Alexa(?!.*(?:_ChkBox)).+

So funktioniert es, danke!