[Gelöst] Regular Expression

Begonnen von pi-user, 23 Mai 2017, 14:15:53

Vorheriges Thema - Nächstes Thema

pi-user

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

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

pi-user

Es so aus, dass so funktioniert. Ich glaube zu mindest!

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

DeeSPe

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
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

pi-user

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.

Wernieman

#5
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

Edit:
Siehe Deine Fehlermeldung in Deinem ersten Beitrag
Zitatm/*
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

pi-user

Ich wollte * für ein beliebiges Zeichen einsetzen. Dafür ist auch das Zeichen * da.

mit /g funktioniert. Danke. 

DeeSPe

NEIN! Dafür ist der Punkt da!

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

nils_

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
viele Wege in FHEM es gibt!

Wernieman

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

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!
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

pi-user

Danke. Dann ist .* das richtige für mich. Ein . ist nur für ein Zeichen.

Wernieman

Nur zur Sicherheit, hast Du Dir mal die Links durchgelesen?
Wir können nur "Hilfe zur Selbsthilfe" anbieten.
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

pi-user


pi-user

Ist das Zeichen m/ fhem spezifisch?

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

Kann man solche Änderungen vornehmen?

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