FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: pi-user am 23 Mai 2017, 14:15:53

Titel: [Gelöst] Regular Expression
Beitrag von: pi-user am 23 Mai 2017, 14:15:53
Hallo zusammen,

was mache ich hier falsch? Ich möchte nur mein String filtern, aber irgendetwas ist noch nicht richtig!

define Motion01.Notify notify Motion01:alarm:.* {\
if($EVENT =~ m/*HomeSecurity: Motion Detection*/) {\
fhem ("Tue etwas");;\
}\
elsif($EVENT =~ m/*cleared: Motion Detection*/) {\
fhem ("Tue etwas");;\
}\
}


Die Fehlermeldung im Log lautet:

: Quantifier follows nothing in regex; marked by <-- HERE in m/* <-- HERE HomeSecurity: Motion Detection*/ at (eval 1391) line 2.

Vielen Dank im Voraus
Titel: Antw:Regular Expression
Beitrag von: DeeSPe am 23 Mai 2017, 14:17:58
Zitat von: pi-user am 23 Mai 2017, 14:15:53
Hallo zusammen,

was mache ich hier falsch? Ich möchte nur mein String filtern, aber irgendetwas ist noch nicht richtig!

define Motion01.Notify notify Motion01:alarm:.* {\
if($EVENT =~ m/*HomeSecurity: Motion Detection*/) {\
fhem ("Tue etwas");;\
}\
elsif($EVENT =~ m/*cleared: Motion Detection*/) {\
fhem ("Tue etwas");;\
}\
}


Vielen Dank im Voraus

* ist falsch, das gibt es so einzeln nicht als RegEx.
http://www.regextester.com/

Gruß
Dan
Titel: Antw:Regular Expression
Beitrag von: pi-user am 23 Mai 2017, 14:28:09
Es so aus, dass so funktioniert. Ich glaube zu mindest!

if($EVENT =~ m/HomeSecurity: Motion Detection/g)
Titel: Antw:Regular Expression
Beitrag von: DeeSPe am 23 Mai 2017, 14:43:32
Da ich nicht weiß was matchen soll kann ich Dir Deine Frage nicht beantworten.
"global" sollte aber beim Matching eines Readingswert nicht nötig sein.

Gruß
Dan
Titel: Antw:Regular Expression
Beitrag von: pi-user am 23 Mai 2017, 14:49:54
Text:

alarm: HomeSecurity: Motion Detection - Unknown Location
alarm: HomeSecurity: Event cleared: Motion Detection - Unknown Location, arg 0108


Jetzt möchte ich einfach filtern:

define Motion01.Notify notify Motion01:alarm:.* {\
if($EVENT =~ m/HomeSecurity: Motion Detection/g) {\
fhem ("Tue Etwas");;\
}\
elsif($EVENT =~ m/cleared: Motion Detection/g) {\
fhem ("Tue Etwas");;\
}\
}


Was soll ich außer global verwenden, damit ich den Teilstring filtern kann? Danke.
Titel: Antw:Regular Expression
Beitrag von: Wernieman am 23 Mai 2017, 14:50:49
Ich glaube, er meinte anstatt "*" ein ".*". Der * an sich bedeutet nur eine belibige Anzahl eines Zeichen davor ... in diesem Falle (erstes *) nicht definiert. Für das 2. "*" bedeutet, es, eine beliebige Anzahl von "n"

Siehe auch:
https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Quantoren (https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Quantoren)

Edit:
Siehe Deine Fehlermeldung in Deinem ersten Beitrag
Zitatm/*
Titel: Antw:Regular Expression
Beitrag von: Otto123 am 23 Mai 2017, 14:56:09
Hi,

schon mal im Eventmonitor einfach probiert ein notify generieren zu lassen? Exakt auf den String und dann modifizieren?

Oder vielleicht braucht es das if dahinter dann auch nicht? :) einfach zwei notify und fertig.

Gruß otto
Titel: Antw:Regular Expression
Beitrag von: pi-user am 23 Mai 2017, 15:29:59
Ich wollte * für ein beliebiges Zeichen einsetzen. Dafür ist auch das Zeichen * da.

mit /g funktioniert. Danke. 
Titel: Antw:Regular Expression
Beitrag von: DeeSPe am 23 Mai 2017, 15:34:30
NEIN! Dafür ist der Punkt da!

Gruß
Dan
Titel: Antw:Regular Expression
Beitrag von: nils_ am 23 Mai 2017, 15:36:07
Zitat von: pi-user am 23 Mai 2017, 15:29:59
Ich wollte * für ein beliebiges Zeichen einsetzen. Dafür ist auch das Zeichen * da.

nein, siehe https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Vordefinierte_Zeichenklassen
da gibts den Punkt für


//edit:
Dan war schneller :P
Titel: Antw:Regular Expression
Beitrag von: Wernieman am 23 Mai 2017, 15:38:59
Warum habe ich eigentlich oben schon einen Wikipedia-Link gesetzt, der scheinbar nicht gelesen wird?

Ich wiederhole mich nicht gerne ... siehe aber:
https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Quantoren (https://de.wikipedia.org/wiki/Regul%C3%A4rer_Ausdruck#Quantoren)

Kurzfassung:
"." ist EIN belibiges Zeichen
".*" ist EIN Beliebiges Zeichen in mehrfacher Ausführung
"n*" ist n in mehrfacher Ausführung.

Wir reden von RegularExpression und n icht von "WildCards" wie z.B. in Filesystemen!
Titel: Antw:Regular Expression
Beitrag von: pi-user am 23 Mai 2017, 15:57:22
Danke. Dann ist .* das richtige für mich. Ein . ist nur für ein Zeichen.
Titel: Antw:Regular Expression
Beitrag von: Wernieman am 23 Mai 2017, 15:58:32
Nur zur Sicherheit, hast Du Dir mal die Links durchgelesen?
Wir können nur "Hilfe zur Selbsthilfe" anbieten.
Titel: Antw:Regular Expression
Beitrag von: pi-user am 23 Mai 2017, 16:03:45
Ich bin gerade dabei.
Titel: Antw:Regular Expression
Beitrag von: pi-user am 23 Mai 2017, 16:09:33
Ist das Zeichen m/ fhem spezifisch?

if($EVENT =~ m/HomeSecurity: Motion Detection/)

Kann man solche Änderungen vornehmen?

if($EVENT =~ m/.*HomeSecurity: Motion Detection.*/)
Titel: Antw:Regular Expression
Beitrag von: nils_ am 23 Mai 2017, 16:13:17
Zitat von: pi-user am 23 Mai 2017, 16:09:33
Ist das Zeichen m/ fhem spezifisch?

eher perl: https://perldoc.perl.org/functions/m.html
Titel: Antw:Regular Expression
Beitrag von: pi-user am 23 Mai 2017, 16:16:20
Super, danke. Gute Seite. :)

https://perldoc.perl.org/perlop.html#Regexp-Quote-Like-Operators
Titel: Antw:Regular Expression
Beitrag von: Wernieman am 23 Mai 2017, 16:16:55
nee .. ist Perl, siehe Wikipedia:
https://de.wikipedia.org/wiki/Perl_(Programmiersprache)#Regul.C3.A4re_Ausdr.C3.BCcke (https://de.wikipedia.org/wiki/Perl_(Programmiersprache)#Regul.C3.A4re_Ausdr.C3.BCcke)

Edit:
nils war schneller

Edit2:
Und pi-user aus  8)
Titel: Antw:Regular Expression
Beitrag von: mumpitzstuff am 23 Mai 2017, 18:21:18
define Motion01.Notify notify Motion01:alarm:.* {\
if($EVENT =~ /HomeSecurity: Motion Detection/) {\
fhem ("Tue etwas");;\
}\
elsif($EVENT =~ /HomeSecurity: Event cleared: Motion Detection/) {\
fhem ("Tue etwas");;\
}\
}


Ich bin ja der Meinung, das weder der m modifier (multiline) noch der g modifier (global) notwendig ist. In $EVENT sollte jeweils nur eine Zeile drin stecken und nicht mehrere (zumindest nicht in deinen). Man braucht auch kein .* oder irgendwas, wenn man nur prüfen will ob der String enthalten ist. Dieses Regexp sollte deshalb ausreichend sein (eventuell muss man den Doppelpunkt noch escapen...).
Titel: Antw:Regular Expression
Beitrag von: pi-user am 24 Mai 2017, 08:27:08
Ich danke Euch vielmals.